0

Resteasy のクライアント フレームワークを使用しており、サーバーへの認証が必要なメソッドがいくつかあります。認証はセッション チケットを介して行われ、このチケットはリクエスト URL にクエリ パラメータとして含まれている必要があります。デフォルトのソリューションでは、次のようにすべてのサービス コールにチケットを渡す必要があります。

@Path("/services")
public class MyServiceClient {

    @POST
    @Path("service1")
    public void callService1(@QueryParam("ticket") String ticket);

    @GET
    @Path("service2")
    @Produces("text/plain")
    public String callService2(@QueryParam("ticket") String ticket, ...);
}

しかし、各サービス呼び出しにチケット パラメータを渡したくありません。これらの各呼び出しのクエリ パラメータとして一般的な方法で設定するソリューションが必要です。したがって、私のサービス コール メソッドは、チケット以外の実際のサービス パラメータのみを受け取ります。ただし、サービスがリクエストされると、リクエスト URL にチケットが含まれます。

これを行う方法はありますか?

前もって感謝します。

4

2 に答える 2

1

@PathParams を囲んでいるクラスにバインドできるので、再宣言せずに各メソッドで使用できると思います。私は試したことはありませんが、ここで例を見ました: http://www.mastertheboss.com/web-interfaces/309-handling-web-parameters-with-resteasy.html

于 2011-05-06T22:16:37.347 に答える
1

私も同じ状況です。古いスレッドを復活させて申し訳ありませんが、とにかく...

クエリ文字列にチケットを配置する代わりに、HTTP ヘッダー、具体的には次のような Authorization ヘッダーとして含めないでください。

Authorization: Token ABCD1234-1234-1234-1234-ABCD1234ABCD

基本認証も受け入れることができます。これにより、派手なプラグインや拡張機能を使用せずに、Web ブラウザーから API を実行できます。ヘッダーは次のようになります。

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

次に、サーバー側のコードで HttpServletFilter を使用して、RestEasyServlet へのすべてのアクセスを保護します。doFilter メソッドで、Authorization ヘッダーを読み取ります。ヘッダーがチェックアウトする場合にのみ、chain.doFilter (リクエストを RestEasyServlet に渡します) を呼び出します。存在しないか、有効期限が切れているか無効であるなどの場合、フィルターから HTTP 401 が返されます。

認証ヘッダーが「トークン」で始まる場合は、最初の 6 文字を取り除き、残りの値を取得して、セッション データベース テーブルまたはマップでルックアップを行います。そこにあり、有効期限が切れていない場合は、通過させてください。

認証ヘッダーが「Basic」で始まる場合は、最初の 6 文字を取り除き、残りを Base64 でデコードします。":" で分割し、2 つのトークンを使用してデータベースでユーザーを検索します。

私も自分のフィルターで少しごまかしています。とにかくデータベースからそのトークン (またはユーザー名/パスワード) を検索する必要があるため、ResultSet から User オブジェクトを作成し、フィルターの ThreadLocal に格納します。次に、JVM の他の場所から「現在のユーザー」にアクセスできるようにする静的メソッドをフィルターに提供します。フィルターで try/finally を使用して ThreadLocal をクリアし、リクエストが終了した後に常にクリアされるようにします。

于 2013-04-26T16:07:21.107 に答える