【问题标题】:Cookies for "Remember me" in JSFJSF 中“记住我”的 Cookie
【发布时间】:2011-08-15 17:41:54
【问题描述】:

我有一个登录页面,我想添加“记住我”功能;这样,如果用户注销并再次打开该页面,则会加载他的用户名和密码。 为此,当用户登录(并选中“记住我”)时,我会保存以下 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 中,我应该如何加密它?最佳做法是什么?

提前致谢

【问题讨论】:

  • 我无法为您解答,但将密码(以任何格式)保存在 cookie 中是个坏主意。任何人都可以篡改它。考虑存储用户唯一的 sessionid 或一些 id。

标签: java jsf cookies


【解决方案1】:

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

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

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

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

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

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

另见:

【讨论】:

  • 谢谢大家!感谢您的快速回答。我没有使用数据库;相反,我使用的是 WS 调用(应用程序服务器处理部分逻辑和持久性)。我想我必须建立一个小型数据库才能提供“记住我”功能..
  • 不客气。作为替代方案,您还可以使用强加密算法(RSA?DES?)加密用户名/密码,并将(十六进制)编码值存储为 cookie 值。
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2013-01-03
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
相关资源
最近更新 更多