[英]Setting a cookie in Apache Components HttpClient but unable to retrieve at the server in HttpServletRequest
[英]Apache Http Components - setting cookie
我正在使用Apache Http Components为本地主机设置cookie。 当我返回cookie时,我得到了输出:
[version: 0][name: testCookie][value: test][domain: http://localhost:9090/][path: /][expiry: Mon Aug 07 19:11:56 BST 2017]
这让我觉得cookie已经设置好了,但是当我在chrome中检查是否在chrome:// settings / cookies中时,那里什么也没有。
public Object makeCookie(String p) throws IOException, MalformedCookieException{
Calendar myCal = Calendar.getInstance();
myCal.set(2017, 07, 07);
Date theDate = myCal.getTime();
CookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("testCookie",p);
// Set effective domain and path attributes
cookie.setDomain("http://localhost:9090/");
cookie.setPath("/");
cookie.setExpiryDate(theDate);
cookieStore.addCookie(cookie);
// Set attributes exactly as sent by the server
cookie.setAttribute(ClientCookie.PATH_ATTR, "/");
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "http://localhost:9090/");
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
return cookie;
}
我已经坚持了好几个小时,只是想不出为什么它没有存储在浏览器中
实际上,您的代码只是创建了客户端cookie存储,而没有将创建的cookie发送到任何地方。
根据Wikipedia( https://en.wikipedia.org/wiki/HTTP_cookie )的说法,“ cookie是从网站发送的一小段数据,并在用户浏览时存储在用户的Web浏览器中。”
HttpClient不是您需要的实体,因为它是客户端,而不是服务器。 您可以使用它来执行对网站的HTTP请求,但它只是使用者,就像您的本地浏览器一样。 因此,即使您在客户端上指定cookie存储,它也不会对本地浏览器产生影响。 服务器(例如网站)是向用户发送cookie的人。
您的代码中的HttpClient和本地浏览器是2个独立的客户端。 他们可以从网站接收cookie,但是这2个客户端本身不是网站。 这就是为什么CloseableHttpClient
对象在这里没有用的原因。 而且,您不在代码中使用它。 另外,由于未正确关闭内存,它可能会泄漏内存。
正如我已经说过的那样,您的代码只是创建了cookie。 因此,您需要将创建的cookie发送给客户端。 您甚至不需要创建cookie存储,只需创建cookie本身即可。
因此,您需要使用Servlet API创建一个简单的Web应用程序。 然后,您可以将创建的cookie附加到所需HTTP请求处理程序中的HttpServlerResponse
对象。 您可以执行以下操作(SpringMVC示例):
@RequestMapping(value = "/", method = RequestMethod.GET, produces = "text/html")
public String index(HttpServletResponse response) {
// no prepareCookie implementation here
Cookie myCookie = prepareCookie();
response.addCookie(myCookie);
// view name
return "index";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.