Cookie maxAge始终为-1

时间:2016-03-27 22:11:52

标签: jsf cookies

我目前正在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指定一些其他属性?

非常感谢。

1 个答案:

答案 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