【问题标题】:Is it possible to invalidate a httpsession from another session using session id?是否可以使用会话 ID 使另一个会话中的 httpsession 无效?
【发布时间】:2016-05-09 11:28:41
【问题描述】:

考虑这种情况

用户 adam 使用带有 emailid adam@web.com 的 webbrowserA 登录到 websiteA 在这里创建一个会话,并将会话 ID 存储在数据库中

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

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

技术:Java,SpringMVC,Sqlserver2008

【问题讨论】:

    标签: java spring-mvc httpsession


    【解决方案1】:

    Spring Security 有 Concurrent Session Control 可以满足您的要求。

    【讨论】:

    • 了解详情。我会在检查后告诉你。借助 spring 过滤器实现并将数据存储在会话数据库中。我也会检查这个
    • @divine;有什么反馈吗?
    【解决方案2】:

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

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

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

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

    如果您使用@bernie 所说的并发会话控制,那么 Spring 安全性或多或少可以自动为您做些什么。

    【讨论】:

    • 了解详情。我会在检查后告诉你。借助 spring 过滤器实现并将数据存储在会话数据库中。我也会检查这个
    • @divine;有什么反馈吗?
    • @Kukeltje 我将 sessionId + useremail 详细信息存储在一个表中。当服务器收到请求时,服务器会检查数据库中的会话ID+用户邮件详细信息,如果存在,则删除该会话ID并创建新的会话ID。此技术允许通过多个浏览器或机器使网站处于登录状态。
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多