浏览器特定会话管理

时间:2014-08-19 06:55:34

标签: java spring java-ee web-applications session-management

让我解释一下我的情景,

我创建了一个spring web应用程序并部署在tomcat上。然后我打开了一个chrome浏览器并启动了该应用程序。它运行成功。然后我再次打开一个新的浏览器让我们说IE / Firefox。然后我又重新启动了我的应用程序。然后,Chrome浏览器中提供的会话应无效或重定向到“登录”页面。简单来说,我应该能够一次在一个浏览器中访问我的网页。

有没有办法用春天实现这个?或任何其他方式??

由于 纳温

2 个答案:

答案 0 :(得分:1)

您没有说明如何进行身份验证。但是,由于您已经在使用Spring,我建议您使用具有可配置会话管理功能的Spring安全性。

使用html配置,您可以要求新会话使来自同一用户的前一个会话无效(摘自Spring安全参考手册3.2.x /安全命名空间配置/高级Web功能/会话管理):

<http>
  ...
  <session-management>
     <concurrency-control max-sessions="1" />
  </session-management>
</http>

或新会话将失败:

<http>
  ...
  <session-management>
     <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
  </session-management>
</http>

答案 1 :(得分:0)

您正在寻找的不是Java Web Container功能的开箱即用。但是,使用某些应用程序逻辑仍然可以实现这一点。以下是实现此目的的一种方法:

  1. 创建一个过滤器,在某些地图中存储用户名作为密钥的映射和相应的会话ID (您也可以使用数据库);如果您使用地图,请务必使用ConcurrentHashMap
  2. 在身份验证过滤器后添加此过滤器
  3. 将针对所有网址调用此过滤器。
  4. 每当请求用户登录时,此过滤器只会添加/覆盖用户名和当前会话ID的映射。
  5. 对于所有其他请求(非登录),过滤器只会根据用户名检查当前会话ID是否与地图中存储的相同。如果是,则继续,否则使会话无效(因为用户已完成由不同会话ID指示的另一个登录)并使用适当的消息重定向用户。