2011-05-09 106 views
0

我们有一个使用Struts 2,Spring和Hibernate的Web应用程序。当用户在其他浏览器中登录时,在一个浏览器中使用户会话失效?

当前使用两种不同浏览器(IE和FF)的用户可以同时登录到同一个帐户。

现在,当您点击登录按钮时,我们需要使该帐户的所有其他登录无效。

例如用户登录到Firefox上的帐户。同一个用户在IE中登录到同一个帐户。在这种情况下,当他登录IE时,他在Firefox中的会话需要失效。

有什么办法可以做到这一点?

请帮

回答

1

关键是“同一个帐户”。如果用户从多个浏览器登录到不同的帐户,我绝不会这样做。

当用户登录时,为与该帐户关联的会话变量取一个随机值。如果会话的值与这个值不同,那么它不是一个有效的会话。

2

如果跟踪的然后是,我想会是可以做到没有登录哪些用户。你已经拥有了自己的身份,现在每次登录时,你都会看到所有当前登录用户和他们的会话列表(保存在你喜欢的任何数据结构中:即静态哈希映射(我知道静态是坏的:-),但它们也是有时是有用的)并且使他以前的会话无效。

你坐在服务器上,你有权力组织会议,只要你喜欢。

+0

我想说你可以改善这两种方式。为了避免静态,使用spring或guice来注入一个单例。其次,如果你有一个集群,或者打算在近期内迁移到一个集群,那么你应该将这些信息存储在一台服务器之外,因为不能保证第二次登录到达同一台服务器。 Memcached可能会正常工作,但我也可以看到像DB一样更持久的东西。您需要一种机制来更新群集中的所有服务器,让他们知道使多余的会话无效。你可能需要某种pub/sub。 – rfeak 2011-05-09 18:25:37

+0

是的,我同意这是一个不考虑聚类的简单化视图。但正如你所建议的memcached或类似的方法应该工作好,并照顾集群。会话将被设计复制(否则集群将不起作用),因此它将用户身份与会话ID相关联。 – 2011-05-09 19:58:26

1

同意Tomasz Stanczak ..但一定要检查帐户第二次登录的IP地址。否则,注销入侵者的原始用户很有可能登录:-)

在我看来,我会去请求用户在登录之前从其他地方(比如IE)注销在这里(比如FF)。看一下gmail的功能(页面底部的 - 帐户活动),您可以从一个地方注销所有其他会话。

+0

你假设入侵者登录第二。 – 2011-05-09 17:15:22

+0

我们实际上不能假定它。如果入侵者首先登录,帐户已经不存在了。:-)您需要添加智能!这很复杂,gmail获得了我见过的复杂认证系统之一。 – 2011-05-10 07:19:09

相关问题