1

私はRESTletAPI(JAVA)を開発しており、ルーターに渡す前にすべてのリクエストを実行するカスタム認証フィルターを作成しました。私のリクエストでは、常にセッションIDをリクエスト属性として渡します。

    http://localhost:8080/myAPI/{sid}/someResource/

これで、 ServerResourceを拡張する関数で、次のようなことを実行して、その{sid}を簡単に抽出できます。

    String sid = (getRequestAttributes().containsKey("sid")) ? getRequestAttributes().get("sid").toString() : "";

私の問題は、Filterを拡張する承認関数(承認関数はルーター経由では呼び出されませんが、メインのcreateInboundRoot()関数で呼び出されます)で、同じメソッドを使用して{sid}を抽出できないことです。request.getResourceRef()。getSegments()の文字列操作を使用して回避策を作成しましたが、もっと良い方法があるはずです。

どんな助けでもありがたいです!

ありがとう

4

1 に答える 1

3

の任意の子に共通の親クラスServerResourceを作成できます。このような:

public class CommonParentResource extends ServerResource
{
    // class definition
}

次に、その中のServerResourceクラスのメソッドをオーバーライドします。doInit()

public class CommonParentResource extends ServerResource
{
    public void doInit()
    {
        boolean authorized=false;

        String sid = getRequestAttributes().containsKey("sid") ? (String)getRequestAttributes().get("sid") : StringUtils.EMPTY;

        // Authorization logic here.

        if(!authorized)//after authorization process completed.
        {
            getResponse().setStatus(Status.CLIENT_ERROR_UNAUTHORIZED);
            getResponse().setEntity(/*Representation carrrying message for unauthorized user*/);
        }
    }
}

ここで、この承認チェックを実行する新しい子クラスはServerResource、このクラスを拡張する必要がありCommonParentResourceます。このような:

public class FriendsListResource extends CommonParentResource
{
    @Get
    //......
}

ここでは2つのポイントが重要です。

  1. doInit()の子クラスのは、 // ..ServerResourceで注釈が付けられたメソッドを呼び出す前に呼び出されます。@Get@Post

  2. (注意)このステートメントを使用しない場合:

    getResponse().setStatus(Status.CLIENT_ERROR_UNAUTHORIZED);
    

    つまり、エラーへの応答のステータスを設定しない場合、 / / / ...で注釈が付けられたメソッドが呼び出されます!ただし、プログラムが応答のステータスをエラーステータスに設定した場合、/ / / ...は実行されず、エンドユーザーには次のようなエラーメッセージが表示されます。@Get@Post@Put@Get@Post@Put

    getResponse().setEntity(/*Representation carrrying message for unauthorized user*/);
    
于 2013-01-18T10:50:01.217 に答える