我目前正在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指定一些其他属性?
非常感谢。
感谢您的回答。我还有一个问题:我首先登录并检查“记住我”,然后退出前检索cookie,并在HttpServletResponse中将maxAge设置为0。然后,我再次登录时没有在筛选器中检查“记住我”,这一次,我仍然可以检索首次登录时创建的相同Cookie,但我不知道cookie为什么仍然存在。 除此之外,关于cookie名称,它应该始终是同一个吗?即使不同的用户登录?如果用户不检查“记住我”而登录,是否应该创建一个cookie? – qiuzmjq
显然你在不同的路径上有多个cookie。一个常见的入门者的错误是,Cookie路径从未明确设置,因此默认为URL中当前打开的文件夹。您应该明确地将Cookie路径设置为您希望使用此Cookie的所有文件夹的公共父级。如果这是webapp的根文件夹,请设置'“/”'。另见a.o. http://stackoverflow.com/a/28177426 – BalusC
我已将路径设置为“/”。我很奇怪第二次登录过滤器时,Cookie仍然存在,即使我已经在HttpServletResponse中将maxAge设置为0,以表示首次注销。 – qiuzmjq