我目前正在JSF中实现“自动登录”机制。实现过滤器以拦截每个请求,并通过读取cookie来检查用户是否已登录。
当用户首次登录时,在托管bean中,cookie以这种方式保存:
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
Cookie cookie = new Cookie("myCookieRef", value);
cookie.setPath("/");
cookie.setMaxAge(3600);
response.addCookie(cookie);
稍后,如果用户执行重定向,则在过滤器中,我使用以下代码来检索cookie:
Cookie[] cookies = request.getCookies();
if (cookies != null)
{
for (Cookie cookie : cookies)
{
if (name.equals("myCookieRef"))
{
return cookie;
}
}
}
request是HttpServletRequest对象。
问题是返回的cookie总是有 -1 maxAge 和 null 值。
我不知道在添加cookie时是否遗漏了任何内容,还是应该为cookie指定一些其他属性?
非常感谢。
答案 0 :(得分:3)
客户端不会将名称和值以外的cookie属性发送回服务器。
另见RFC6265 section 4.2.2(强调我的)。
4.2.2。语义
每个cookie对代表用户代理存储的cookie。该 cookie-pair包含用户代理的cookie-name和cookie-value 在Set-Cookie标题中收到。
请注意,不会返回Cookie属性。特别是, 一个服务器无法单独从Cookie标头确定 cookie将过期,cookie的有效主机为哪个 cookie的路径有效,或者cookie是否设置为 安全或HttpOnly属性。
最大年龄的行为符合指定。此外,如果它已在客户端过期,那么整个cookie就不会从客户端发送到服务器。在服务器端,您通常只需在每次"自动登录时延长cookie的生命周期"只需设置一个具有相同名称/值的新cookie,并在没有登录用户的情况下签入请求,如果cookie存在与否,则不会是否已过期。
如果出于其他原因,最大年龄值对您来说非常重要,只需将其存储在某个数据库中,并附上唯一的Cookie标识符(Cookie值)。
对于null
值,这表示您自己的代码中的问题不在Cookie中。到目前为止提供的信息中看不到此问题,但我确定如果您再次检查/调试它,您将发现一个简单的错误。
关于"自动登录"的具体功能要求,这可能是一个有用的读物:How to implement "Stay Logged In" when user login in to the web application。