0

我有一个受保护的资源,需要我登录。我使用具有以下代码块的公共客户端。

    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();

以上是我基本上登录的地方。这很好,我得到了一个不错的小 JSESSIONID cookie。

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

当我检查第二个请求的服务器上的逻辑时,我注意到我们使用了不同的 JSESSIONID。因此,get 似乎无法登录。我的印象是 httpClient 管理 cookie 并将相同的 cookie 发回。当我通过 UI 正常登录我的应用程序时,我在每个请求中看到相同的 cookie,只是在此测试代码中没有。

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

我是否需要对 httpClient 做一些事情以确保它在执行 get 请求时使用与第一个 post 请求相同的 cookie?

提前致谢。

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 回答