2016-03-27 92 views
0

我目前正在JSF中实现“自动登录”机制。实现过滤器来拦截每个请求,并通过读取cookie来检查用户是否已登录。Cookie maxAge总是-1

当用户第一次登录,在管理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; 
     } 
    } 
} 

请求是HttpServletRequest对象。

的问题是返回的饼干总是有一个-1MAXAGE

我不知道在添加cookie时是否错过任何内容,或者我应该为Cookie指定一些其他属性?

非常感谢。

回答

2

客户端不会将名称和值以外的cookie属性发送回服务器。

另请参阅RFC6265 section 4.2.2(强调我的)。

4.2.2。语义

每个cookie对表示由用户代理存储的cookie。 Cookie对包含用户代理 在Set-Cookie标头中收到的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

+0

感谢您的回答。我还有一个问题:我首先登录并检查“记住我”,然后退出前检索cookie,并在HttpServletResponse中将maxAge设置为0。然后,我再次登录时没有在筛选器中检查“记住我”,这一次,我仍然可以检索首次登录时创建的相同Cookie,但我不知道cookie为什么仍然存在。 除此之外,关于cookie名称,它应该始终是同一个吗?即使不同的用户登录?如果用户不检查“记住我”而登录,是否应该创建一个cookie? – qiuzmjq

+0

显然你在不同的路径上有多个cookie。一个常见的入门者的错误是,Cookie路径从未明确设置,因此默认为URL中当前打开的文件夹。您应该明确地将Cookie路径设置为您希望使用此Cookie的所有文件夹的公共父级。如果这是webapp的根文件夹,请设置'“/”'。另见a.o. http://stackoverflow.com/a/28177426 – BalusC

+0

我已将路径设置为“/”。我很奇怪第二次登录过滤器时,Cookie仍然存在,即使我已经在HttpServletResponse中将maxAge设置为0,以表示首次注销。 – qiuzmjq