Servlets 限制同一用户跨2个Web应用程序多次登录

Servlets 限制同一用户跨2个Web应用程序多次登录,servlets,architecture,websphere,httpsession,tomcat9,Servlets,Architecture,Websphere,Httpsession,Tomcat9,我们需要限制同一用户在两个Web应用程序中并发登录 我们有两个Web应用程序,例如:WebApp1、WebApp2 用户:仪表板 如果仪表板用户登录到WebApp1,则不允许同一用户登录到WebApp2,而是在第二次登录时显示错误消息 尝试过的解决方案: 如果存在活动会话,则阻止使用相同用户id的第二次登录,并向用户显示错误消息 其思想是在DB中维护用户id、应用程序名称和会话id。在同一用户第二次登录时,根据用户id检查DB表中是否存在记录,然后阻止第二次登录并向用户显示错误消息 清除下面的D

我们需要限制同一用户在两个Web应用程序中并发登录

我们有两个Web应用程序,例如:WebApp1、WebApp2

用户:仪表板

如果仪表板用户登录到WebApp1,则不允许同一用户登录到WebApp2,而是在第二次登录时显示错误消息

尝试过的解决方案:

如果存在活动会话,则阻止使用相同用户id的第二次登录,并向用户显示错误消息

其思想是在DB中维护用户id、应用程序名称和会话id。在同一用户第二次登录时,根据用户id检查DB表中是否存在记录,然后阻止第二次登录并向用户显示错误消息

清除下面的DB记录用户Id、会话Id和应用程序名称 场景:

注销 会话超时 重新启动应用程序。 不确定如何处理以下情况

关闭浏览器。 浏览器崩溃 系统崩溃 如果第二次登录请求来自有效用户,则管理员应能够使第一次登录的会话无效,因为该用户是攻击者


使WebApp2/WebApp1的Http会话无效的最佳方法是什么?

如果您确实需要了解第一个会话的状态,我将跳过在服务器中管理会话的尝试,而是维护来自客户端的心跳信号。让客户端每5秒向服务器发出一次请求,更新最后一次看到的记录,其中包括他们的IP地址和他们来自哪个应用程序,以及最后一次看到的是否是注销事件


然后,另一个应用程序可以查询最后一次出现的时间,如果超过5秒,我实际上会将其调到10秒以进行查询或注销事件,假设第一次会话已结束,并且他们可以自由登录第二个应用程序。如果最后一次看到的时间不到5-10秒,则将两个IP地址都清除,并用这两个IP地址通知管理员,以决定应该杀死哪一个

除了您所拥有的,您还可以在会话数据库中保存最后一次活动时间,并在会话更新时更新它,每个请求的频率或每5分钟一次(例如)取决于您的需求。然后,在应用程序/浏览器/系统重新启动的情况下,即使记录存在,您也可以登录用户,前提是该记录比会话超时时间早。您可以让管理员用户在需要时手动删除条目


另一个解决方案是始终登录新应用程序,然后注销旧应用程序。但这需要在应用程序中引入额外的逻辑来检查会话是否仍然有效。

这太过分了。假设你有1k个用户,这将每秒给你200个无用的请求。您还可以有效地禁用会话不活动超时,因为UI会不断生成新请求。感谢您的响应。要注销旧应用程序:有两个Web应用程序不确定如何获取其他Web应用程序的HttpSession。例如:仪表板用户登录WebApp1,同一用户第二次登录WebApp2。我认为可能需要考虑在容器级别编写代码——例如:Tomcat-Valve。这就是为什么我编写的需要额外逻辑的代码可能依赖于运行时。当然,您可以编写一些简单但可能不是最好的性能/效率,比如servlet过滤器,它将检查数据库会话是否仍然有效,如果无效,则在容器中自动注销。