我遇到了在Servlet中正确设置(持久/跨浏览器会话)cookie的数据以及在Filter中读取它的问题。
Servlet的代码(在登录时运行)是:
String encodedValue = new String(Base64
.encodeBase64(req.getParameter("account").getBytes()));
Cookie cookie = new Cookie("projectAuthenticationCookie", encodedValue );
cookie.setMaxAge(24*60*60);
cookie.setPath("/");
res.addCookie(cookie);
这将在响应中获取cookie,但是当我在我的过滤器中使用以下代码读取它时:
Cookie authenticationCookie = null;
Cookie[] cookies = ((HttpServletRequest) request).getCookies();
for (Cookie cookie : cookies){
if ("projectAuthenticationCookie".equals(cookie.getName())) {
authenticationCookie = cookie;
}
}
我只得到我设置的值,所有其他字段都是null,空或不同。例如,最大年龄总是返回-1,因此cookie永远不会存在。
我尝试将expires-header设置为:
res.setDateHeader("Expires", System.currentTimeMillis() + 24*60*60*1000);
当我读到没有有效的expires-header时,会话将会超时(如果我错了,请纠正我),但这也无济于事......
我想到的一个问题是我在localhost上运行(尝试设置cookie.setDomain(“localhost”)但也没有运气)。我的Web服务器/ serclet容器是Jetty 7,但我不认为这是相关的......
任何提示?
答案 0 :(得分:6)
您从请求中获取的Cookie中不会填充名称和值以外的字段(因此没有意义)。
这些字段旨在通知浏览器最大年龄; cookie的路径等,但浏览器不会将此信息发送回服务器。唯一一个拥有正确的最大年龄,路径等的重要时刻是创建cookie并将其添加到响应中。使用浏览器检查它是否存储了正确的信息,而不是尝试在服务器端找到它。