Java 饼干;“记住我”;在JSF中

Java 饼干;“记住我”;在JSF中,java,jsf,cookies,Java,Jsf,Cookies,我有一个登录页面,我想添加“记住我”功能;这样,如果用户注销并再次打开页面,就会加载他的用户名和密码。 为此,当用户登录(并选中“记住我”)时,我保存以下cookie: FacesContext facesContext = FacesContext.getCurrentInstance(); Cookie userCookie = new Cookie("vtusername", username); userCookie.setMaxAge(3600); ((HttpServletRespo

我有一个登录页面,我想添加“记住我”功能;这样,如果用户注销并再次打开页面,就会加载他的用户名和密码。 为此,当用户登录(并选中“记住我”)时,我保存以下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);
问题是后来(在同一个会话中)我读了cookies,我看到maxAge=-1;即使我将它设置为3600…为什么? 另一个问题:如果我用userCookie.setSecure(true)设置cookie安全,那么我就无法读取它(它会消失)

另一个问题:既然密码存储在cookie中,我应该如何加密它?最佳做法是什么

提前谢谢

问题是后来(在同一个会话中)我读了cookies,我看到maxAge=-1;即使我将它设置为3600…为什么

因为浏览器不会发回最大值。它只会发回cookie name=值。最大值只存储在浏览器中。您可以在浏览器本身的cookie查看器/编辑器中进行检查。例如,在Firefox中,您可以通过工具>选项>隐私>删除单个cookie来检查所有cookie。输入域(例如本地主机)看看饼干

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

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

另一个问题:既然密码存储在cookie中,我应该如何加密它?最佳做法是什么

不要将原始名称/密码存储在两个cookie中。除此之外,这可以很容易地存储在一个cookie中,这是一个非常糟糕的主意,而且很容易被破解。使用一个cookie,该cookie具有自动生成的长、唯一且无法猜测的值。将此值与用户ID一起存储在服务器端的数据库中。当有人访问您的站点时使用此cookie,但用户尚未登录(即会话中没有
user
对象),则可以进行自动登录

另见:

我没有答案,但是在cookie中保存密码(以任何格式)是不好的。任何人都可以篡改它。考虑将SeSession ID或某些ID存储给用户。谢谢各位!我感谢您的快速回答。我没有使用数据库,而是使用WS调用。(应用服务器处理部分逻辑和持久性)。我必须建立一个小型数据库,以提供“记住我”功能。不客气。作为替代方案,您还可以使用强加密算法(RSA?DES?)加密用户名/密码,并将(十六进制)编码值存储为cookie值。