Java 如何让用户登录我的站点数月?

Java 如何让用户登录我的站点数月?,java,session,servlets,login,openid,Java,Session,Servlets,Login,Openid,我正在使用OpenID。如何使用户即使在关闭浏览器窗口后也能长时间保持登录 如何存储和访问用户的user对象 基本上,我想我只是不太明白会话在Java中是如何工作的。那么你真的想要像“在这台计算机上记住我”这样的选项吗?这实际上与OpenID部分无关。以下是一种语言不可知的方法: 首先创建一个DB表,其中至少包含cookie\u id和user\u id列。如有必要,还可以添加cookie\u ttl和ip\u锁。我想这些列名说明了一切 第一次登录时(如果需要,只选中“记住我”选项),生成一

我正在使用OpenID。如何使用户即使在关闭浏览器窗口后也能长时间保持登录

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


基本上,我想我只是不太明白会话在Java中是如何工作的。

那么你真的想要像“在这台计算机上记住我”这样的选项吗?这实际上与OpenID部分无关。以下是一种语言不可知的方法:

  • 首先创建一个DB表,其中至少包含
    cookie\u id
    user\u id
    列。如有必要,还可以添加
    cookie\u ttl
    ip\u锁
    。我想这些列名说明了一切

  • 第一次登录时(如果需要,只选中“记住我”选项),生成一个长的、唯一的、难以猜测的密钥(与用户无关),该密钥表示
    cookie\u id
    ,并将其与
    用户id
    一起存储在数据库中。将
    cookie\u id
    存储为具有已知cookie名称的cookie的cookie值,例如
    记住
    。给饼干一个较长的生命周期,例如一年

  • 在每个请求中,检查用户是否已登录。如果没有,则检查与cookie名称关联的cookie值
    cookie\u id
    记住
    。如果存在并且根据DB有效,则自动登录与
    用户id
    关联的用户,并再次推迟cookie时间,如果有,也推迟DB中的
    cookie ttl

在Java/JSP/Servlet术语中,使用添加cookie和获取cookie。您可以在侦听所需资源的
过滤器中执行所有第一次检查,例如
/*
,或者可能有一点限制

关于会话,这里不需要它。它的寿命比你需要的要短。仅当登录用户或“已找到”用户具有有效的
记住
cookie时,才使用它放置该用户。通过这种方式,
过滤器
只需检查其在会话中的存在,而无需每次都检查cookie

这毕竟是相当直截了当的。祝你好运

另见:

我选择OpenID的最初原因是为了让其他人能够为我处理尽可能多的认证实现和安全性

在进一步研究OpenID之后,似乎有一个叫做“立即请求”(immediaterequest)的东西

当请求认证时,依赖方可以请求OP不与最终用户交互。在这种情况下,OP必须立即做出响应,要么断言身份验证成功,要么响应表明如果没有进一步的用户交互,请求将无法完成

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


这种方法似乎是OpenID建议对他们的文档执行的方法。

谢谢BalusC,你知道有什么automagic方法可以为我实现所有这些吗?或者大多数站点实际上是自己创建数据库表和逻辑的吗?我只是想,这是一件非常常见的事情,它会被构建到一个库或语言或其他东西中。对不起,没人想到。但这些都是你自己真正可以做到的。如果你不知何故结巴和/或有问题,只需在这里问问题即可。嗅探或窃取cookies并从web上的任何位置重用它们都很容易。这基本上是类固醇会话劫持。@sfusseneger:它与普通的Servlet
HttpSession
(jsessionid)、PHP
$\u session
(phpsessionid)以及其他Web语言/框架使用的任何其他会话构造有何不同?我只是明确地说“生成一个长的、唯一的、难以猜测的密钥(与用户无关)”。劫持用于加密会话数据的代码并滥用它(特别是在它是分布式和/或开源的情况下)比猜测/劫持完全随机的会话密钥并滥用它更容易。你说的-1没有任何意义,但如果这让你感觉好一点,请便:)@sfussenger:我知道你是这里的另一个回答者。你自己的答案如何更安全?您基本上是将所有敏感信息存储在cookie中,而不是服务器端的DB中!无论是否加密,它都是不安全的,并且在加密它的代码逻辑被劫持/泄露时可能会影响所有用户。另外,您可能已经错过了我在回答中提到的
cookie\u ttl
ip\u lock
的全部要点。这当然是一个更适合OpenID思想的有趣的替代方案。然而,我自己还没有在我的网络应用程序中使用OpenID,但在阅读了其中的一个和另一个之后,我会说,按照你链接的文档中的描述去做。这可能是最好的答案