【问题标题】:Apache HttpClient 4.0.3 - how do I set cookie with sessionID for POST request?Apache HttpClient 4.0.3 - 如何为 POST 请求设置带有 sessionID 的 cookie?
【发布时间】:2011-05-09 03:27:46
【问题描述】:

你能告诉我如何将 jsessionid 存储在 cookie 中,以便它可以通过 post 请求传递给 servlet 吗?我正在使用 Apache HttpClient 4.0.3 版。 我找到的所有解决方案都解释了如何使用 HttpClient 3.1 执行此操作。 我已经阅读了教程并尝试了这个,但它不起作用。

HttpPost httppost = new HttpPost(postData);
CookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", getSessionId());
cookieStore.addCookie(cookie);
client.setCookieStore(cookieStore);
response = client.execute(httppost);

编辑 - 进一步解释
我正在连接到朋友编写的 servlet。我已经登录并获得了jsessionid。现在我想发送另一个请求并且需要传递 jsessionid 以进行授权。 Servlet 工作正常,因为我使用了 java HttpURLConnection,设置了 cookie,传递了它并且它工作了。现在使用 HttpClient 我没有任何异常,但是来自朋友的 servlet 的返回码表明请求中没有 sessionid。

另一个编辑 - 我有一个解决方案 我设置了请求标头的参数并且它起作用了。 Servlet 识别出 sessionid。
httppost.setHeader("Cookie", "JSESSIONID="+ getSessionId());

现在我的问题是:这种方法正确吗?

【问题讨论】:

  • 你能告诉我们究竟是什么不起作用吗?您是否遇到异常或请求发送时没有 cookie?能否提供网络协议转储?
  • 试试 Fiddler fiddler2.com/fiddler2 看看到底发生了什么。
  • 非常感谢!我设法让我的服务器通过以下方式识别 cookie:httppost.setHeader("Cookie", "JSESSIONID="+ getSessionId());
  • 简直太棒了!!你救了我

标签: java post cookies apache-httpclient-4.x


【解决方案1】:

我很高兴解决了这个问题:

HttpPost httppost = new HttpPost(postData); 
CookieStore cookieStore = new BasicCookieStore(); 
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", getSessionId());

//cookie.setDomain("your domain");
cookie.setPath("/");

cookieStore.addCookie(cookie); 
client.setCookieStore(cookieStore); 
response = client.execute(httppost); 

这么简单!

【讨论】:

  • 对我来说关键是设置域和路径。没有它,它不会将 cookie 传递给服务器。
  • 我花了很多时间解决cookies的问题,服务器不想接受我的请求,但是firebug和chrome开发工具显示除了value之外的所有cookien参数都是空的。只有当我设置域和路径值时,请求才成功。谢谢。
  • 这种方法现在被弃用了,因为 AbstractHttpClient 公开了 setCookieStore 方法,现在从 4.3 版开始被弃用。 @khai 的方法现在是首选。
  • 未来更新:对于 apache http 客户端 >=4.5,还需要this 回答。
【解决方案2】:

我通过 HttpContext 传递 cookie 来做到这一点:

HttpContext localContext = new BasicHttpContext();

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

response = client.execute(httppost, localContext);

【讨论】:

  • 您应该使用 HttpClientContext 而不是现在标记为已弃用的 ClientContext。
  • 未来更新:对于 apache http 客户端 >=4.5,还需要this 回答。
【解决方案3】:
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
response = client.execute(httppost, localContext);

在没有 4.5 版本的情况下不起作用

cookie.setDomain(".domain.com");
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");

【讨论】:

  • 我也在另一个主题中找到了这个答案,真的,它应该设置域。
【解决方案4】:

您可能应该设置所有 cookie 属性,而不仅仅是它的值。 setPath(), setDomain() ...等

【讨论】:

  • 欢迎来到本站!这是 2010 年的一个问题,有两个答案得到了很多人的支持。我不确定额外的、不精确的提示是否会对任何人有所帮助。
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多