繁体   English   中英

apache commons httpclient 4.23表单登录问题在不同请求中使用了不同的会话cookie

[英]apache commons httpclient 4.23 form login problems different session cookies used in different requests

我有一个受保护的资源,需要我登录。 我在下面的代码块中使用了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();

以上是我基本上登录的地方。 即时获得一个不错的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做一些事情以确保它在获取请求时使用第一个发布请求中的相同cookie?

提前致谢。

您对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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM