Apache HttpClient 4.0.3 - 如何为POST请求设置带sessionID的cookie?

hit*_*tan 45 java cookies post apache-httpclient-4.x

你能告诉我如何在cookie中存储jsessionid,所以它可以通过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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 41

我很高兴解决这个问题:

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); 
Run Code Online (Sandbox Code Playgroud)

太简单!

  • 对我而言,关键是设置域和路径.没有它,它不会将cookie传递给服务器. (12认同)

小智 22

我是通过将cookie传递给HttpContext来完成的:

HttpContext localContext = new BasicHttpContext();

localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

response = client.execute(httppost, localContext);
Run Code Online (Sandbox Code Playgroud)

  • 您应该使用 HttpClientContext 而不是 ClientContext ,后者现在被标记为已弃用。 (2认同)
  • 来自未来的更新:对于 apache http 客户端 >=4.5,您还需要 [this](/sf/answers/2407753421/) 答案。 (2认同)

lil*_*iya 11

HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
response = client.execute(httppost, localContext);
Run Code Online (Sandbox Code Playgroud)

不适用于4.5版本

cookie.setDomain(".domain.com");
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");
Run Code Online (Sandbox Code Playgroud)