是否可以使用会话ID使来自另一个会话的httpsession无效?

时间:2016-05-09 11:28:41

标签: java spring-mvc httpsession

考虑这种情况

用户adam使用webbrowserA使用emailid adam@web.com登录websiteA 此处创建会话,会话ID存储在数据库

然后,用户adam使用webbrowserB使用emailid adam@web.com登录websiteA 此处创建会话,会话ID存储在数据库中

当用户adam使用webbrowserB登录时,我需要使用webbrowserA创建的会话无效(假设webbrowserA中的会话处于活动状态)。如何使用webbrowserA使用它的sessionid或其他可能的方式使使用webbrowserA创建的会话无效?

技术:Java,SpringMVC,Sqlserver2008

2 个答案:

答案 0 :(得分:2)

Spring Security有Concurrent Session Control可以按你的要求行事。

答案 1 :(得分:1)

没有直接的方法可以使来自另一个会话的会话无效。但是,您可以在ServletContext属性中存储不再接受的会话ID列表。

然后你可以使用一个过滤器,为每个请求测试当前会话是否存在并属于该列表。如果是,则可以从过滤器中使其无效。

对于您的用例,IMHO最简单的方法是在ServletContext属性中保留HashMap<String, Integer>映射用户邮件的当前会话ID,并在每个会话中(在会话属性中)存储该电子邮件用户 - 为此,您只需在每次成功登录后更新这些属性。

您使用过滤器来测试当前会话是否已连接(包含电子邮件)以及该ID是否是该电子邮件的注册ID。如果它不是注册的ID,则过滤器会使会话无效并重定向到登录页面(或者由于另一个具有相同ID的登录而解释会话已关闭的页面)

如果你使用@bernie所说的并发会话控制,这或多或少是Spring安全可以自动完成的。