在JSF中“记住我”的Cookie

时间:2011-04-29 19:17:59

标签: java jsf cookies

我有一个登录页面,我想添加“记住我”功能;这样,如果用户注销并再次打开页面,则会加载他的用户名和密码。 为此,当用户登录(并且“记住我”被选中“)时,我保存以下cookie:

FacesContext facesContext = FacesContext.getCurrentInstance();
Cookie userCookie = new Cookie("vtusername", username);
userCookie.setMaxAge(3600);
((HttpServletResponse) facesContext.getExternalContext()
       .getResponse()).addCookie(userCookie);
Cookie passCokie = new Cookie("vtpassword", password);
passCokie.setMaxAge(3600);
 ((HttpServletResponse) facesContext.getExternalContext()
       .getResponse()).addCookie(passCokie);

问题是后来(在同一个会话中)我读了cookie,我看到maxAge = -1;即使我把它设置为3600 ......为什么? 另一个问题:如果我使用userCookie.setSecure(true)设置cookie安全,那么我就无法读取它(它消失了)。

另一个问题:由于密码存储在cookie中,我应该如何对其进行加密?什么是最佳做法?

提前致谢

1 个答案:

答案 0 :(得分:8)

  

问题是稍后(在同一个会话中)我读了cookie,我看到maxAge = -1;即使我将它设置为3600 ......为什么会这样?

因为浏览器没有发回maxage。它只返回cookie name = value。 maxage仅存储在浏览器中。您可以在webbrowser本身的cookie查看器/编辑器中进行检查。例如,在Firefox中,您可以通过工具>检查所有Cookie。选项>隐私>删除单个cookie 。输入域名(例如localhost)以查看cookie。

  

另一个问题:如果我使用userCookie.setSecure(true)设置cookie安全,那么我就无法读取它(它消失了)。

仅当通过HTTPS而不是HTTP提供请求/响应时,它才有效。此外,当请求已通过HTTPS提供时,它将默认为secure = true。

  

另一个问题:由于密码存储在cookie中,我应该如何对其进行加密?什么是最佳做法?

不要将原始名称/密码存储在两个cookie中。除此之外,这可以很容易地只用一个cookie,这是一个非常糟糕的主意,很容易被破解。使用具有自动生成的长,唯一且不可能猜测的值的单个cookie。将此值与用户标识一起存储在服务器端的数据库中。如果有人使用此Cookie访问您的网站,但用户尚未登录(即会话中没有User个对象),则可以自动登录。

另见: