考虑这种情况
用户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
答案 0 :(得分:2)
Spring Security有Concurrent Session Control可以按你的要求行事。
答案 1 :(得分:1)
没有直接的方法可以使来自另一个会话的会话无效。但是,您可以在ServletContext属性中存储不再接受的会话ID列表。
然后你可以使用一个过滤器,为每个请求测试当前会话是否存在并属于该列表。如果是,则可以从过滤器中使其无效。
对于您的用例,IMHO最简单的方法是在ServletContext属性中保留HashMap<String, Integer>
映射用户邮件的当前会话ID,并在每个会话中(在会话属性中)存储该电子邮件用户 - 为此,您只需在每次成功登录后更新这些属性。
您使用过滤器来测试当前会话是否已连接(包含电子邮件)以及该ID是否是该电子邮件的注册ID。如果它不是注册的ID,则过滤器会使会话无效并重定向到登录页面(或者由于另一个具有相同ID的登录而解释会话已关闭的页面)
如果你使用@bernie所说的并发会话控制,这或多或少是Spring安全可以自动完成的。