如何让用户登录我的网站好几个月?

Kyl*_*yle 17 java openid session servlets login

我正在使用OpenID.如何使用户即使关闭浏览器窗口后仍能长时间登录?

如何存储和访问用户的User对象?

基本上,我想我真的不明白会话如何在Java中运行.

Bal*_*usC 33

所以你真的想要一个"在这台电脑上记住我"选项吗?这实际上与OpenID部分无关.这是一种与语言无关的方法:

  • 首先,创建至少一个数据库表cookie_iduser_id列.如果有必要还添加一个cookie_ttlip_lock.我想这些列名称本身就说明了一切.

  • 在第一次登录(如果必要的话只能用"记住我"选项选中),产生一个长期的,独特的,难以猜测密钥(这是在没有办法与用户),它代表了cookie_id和其存储在数据库连同user_id.存储cookie_id具有已知cookie名称的cookie的cookie值,例如remember.给cookie一个很长的寿命,例如一年.

  • 在每个请求中,检查用户是否已登录.如果没有,则检查cookie_id与cookie名称关联的cookie值remember.如果它存在且根据数据库有效,则自动登录与之关联的用户user_id并再次推迟cookie年龄,如果有的话,也在cookie_ttl数据库中.

在Java/JSP/Servlet术语中,使用HttpServletResponse#addCookie()添加cookie并HttpServletRequest#getCookies()获取cookie.您可以进行所有首次检查,以Filter监听所需的资源,例如/*或者可能更受限制.

关于会话,你在这里不需要它.它的寿命比您需要的短.仅在登录用户或"找到"用户拥有有效remembercookie 时使用它.这样就Filter可以检查它在会话中的存在,然后不需要每次都检查cookie.

毕竟这是相当直接的.祝好运.

也可以看看:

  • @sfussenegger:我看到你是这里的另一个回答者.你自己的答案如何安全?您基本上将所有敏感信息存储在cookie中,而不是存储在服务器端的DB中!加密与否,它是不安全的,并且只要加密它的代码逻辑被劫持/显示,它就可能影响**所有**用户.你也许错过了我在答案中提到的`cookie_ttl`和`ip_lock`这一点. (4认同)
  • @artaxerxe:a [filter](http://stackoverflow.com/tags/servlet-filters/info). (2认同)

Kyl*_*yle 8

好吧,我选择OpenID的原因是其他人可以为我处理尽可能多的身份验证实现和安全性.

在更多地研究OpenID之后,似乎有一种叫做"立即请求"的东西(http://openid.net/specs/openid-authentication-2_0.html#anchor28).

请求身份验证时,依赖方可以请求OP不与最终用户交互.在这种情况下,OP必须立即响应认证成功的断言,或者指示在没有进一步的用户交互的情况下无法完成请求的响应.

因此,我认为我可以将用户的openID url存储在cookie中,并使用立即请求来查看用户是否经过身份验证.这样我就不必对我的数据库做任何事情,或者实现任何逻辑来防止对长期存在的cookie进行会话劫持.

这种方法似乎是OpenID建议使用其依赖方最佳实践文档的方式.