0

ログインが必要な保護されたリソースがあります。次のコードブロックでcommonsクライアントを使用しています。

    HttpClient httpClient = new HttpClient();
    httpClient.getParams().setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
    httpClient.getParams().setParameter("http.protocol.single-cookie-header", Boolean.TRUE);

    PostMethod postMethod = new PostMethod("/admin/adminlogon.do");
    postMethod.setRequestEntity(new StringRequestEntity("action=logon&adminUser=admin&adminPassword=password",
            "application/x-www-form-urlencoded",
            "UTF-8"));
    postMethod.addParameter("action","logon");
    postMethod.addParameter("adminUser","admin");
    postMethod.addParameter("adminPassword","password");

    httpClient.executeMethod(postMethod);
    String response2 = postMethod.getResponseBodyAsString();

上記は基本的にログインする場所です。これは、素敵なJSESSIONIDCookieを取り戻すことで問題なく機能します。

    GetMethod get = new GetMethod("/admin/api.do?action=getSomeJson");
    httpClient.executeMethod(get);

2番目のリクエストのサーバーのロジックを確認すると、別のJSESSIONIDを使用していることがわかります。したがって、getはログインに失敗したようです。httpClientがCookieを管理し、同じCookieを送り返したという印象を受けました。UIを介して通常どおりアプリにログインすると、このテストコードではなく、各リクエストに同じCookieが表示されます。

    String s = get.getResponseBodyAsString();
    get.releaseConnection();

httpClientがgetリクエストを実行するときに、最初のpostリクエストと同じCookieを使用するようにするには、httpClientで何かを行う必要がありますか?

前もって感謝します。

4

1 に答える 1

1

HTTPクライアントのCookieの動作に関する仮定は正しいです。あなたの場合、同じhttpClientインスタンスを使用しないでください。これを修正するには、httpClientを(PostConstructorで)一度だけ割り当てる必要があります。

       httpClient = new DefaultHttpClient(); // or new HttpClient();

次に、クライアントの同じインスタンスを使用して呼び出しを実行します。クライアントは応答からCookieを取得し、それをcookieStoreに保存して、次のリクエストで送信します。

[コメントの後に追加]次のコードは私のために動作します:

    httpClient = new DefaultHttpClient();
    // Create a local instance of cookie store
    cookieStore = new BasicCookieStore();
    // Set the store
    httpClient.setCookieStore(cookieStore);
于 2013-03-20T06:25:52.220 に答える