Java如何在使用相同凭据记录两次时使用户会话无效

时间:2010-09-14 09:47:02

标签: java session cluster-computing

你好。 我找到了这个有趣的线程,关于如何在用户会话记录两次时使其无效。

How to invalidate an user session when he logs twice with the same credentials

我的环境略有不同,但我应该解决同样的问题。 不同之处在于我不使用JSF并且我的应用程序在群集上运行。

我愿意应用这种模式,但我想知道应该在哪里保存用户地图? 群集中的所有计算机是否都可以看到上下文?

提前致谢

1 个答案:

答案 0 :(得分:2)

关于在群集上运行应用程序的观点比缺少JSF更重要和相关。

群集对任何解决方案的要求是该解决方案需要使用群集的所有成员都可访问的共享存储。有几种可能的解决方案可以满足这一要求:

  • 使用数据库存储所有当前登录用户的列表(使用ID标识其会话;可以使用JSESSIONID,但最好使用保证在群集中所有成员之间唯一的ID )。即使是用户ID和集群成员ID的组合也可以。这是最简单的,但它需要您测试代码如何处理故障转移(您可能必须在会话故障转移时更新数据库中的条目)。
  • 使用应用程序上下文(ServletContext)。这是一种可能的解决方案,但根本不推荐。虽然应用程序上下文必须在所有集群成员中保持最新,但是要保持内容最新(集群成员之间的网络流量增加)是成本。
  • 使用像Terracotta或Coherence这样的分布式缓存解决方案。此解决方案与前一个解决方案几乎相同,只是会话“map”不会在ServletContext中进行管理。更新分布式缓存时必然会发生网络流量。