每个用户只允许一个会话

Amo*_*kar 6 java session spring struts2

我们有一个使用struts2,spring和hibernate开发的web应用程序.

该应用程序需要一个用户只能从一个浏览器登录的功能.

假如用户x,登录到pc-1浏览器ff,那么他就无法从任何其他地方登录.

我通过实现会话映射尝试了它并将会话存储在全局映射中,但是当用户注销并尝试再次登录时,这会失败.

即使它没有严重失败,如果用户没有注销和会话超时,但地图没有被清除.

任何更好的想法来实现此功能.

我们不希望阻止用户登录,但不希望用户通过允许用户共享信用并允许具有相同登录的多个用户发生来利用该应用程序.

mpr*_*hat 14

由于您已经在使用Spring,我建议您将应用程序与Spring Security集成.

Spring安全性允许您同时定义每个用户允许的最大会话数.

<session-management>
        <concurrency-control max-sessions="1" />
</session-management>
Run Code Online (Sandbox Code Playgroud)

如果在具有有效会话的用户尝试再次登录时设置,则会通知用户最大并发访问权限设置为1.

更多.

如果弹簧安全性不适合您,那么:

  1. 使用SessionInterceptor会检查会话有效性的会话,如果会话有效,它将检查用户是否已经登录到应用程序(为此,如果找到有效的登录,则必须在某处维护会话,例如每次成功登录的数据库)将用户再次重定向到具有自定义消息的登录页面,或者注销已经有效的会话,然后重定向他再次登录.如果您注销早期会话,则意味着该浏览器会话中的任何连续操作都必须处理无效会话.

  2. 如果您Servlet在应用程序中也使用了Interceptor,那么Interceptor将无法为您工作,在这种情况下,您应该使用a Filter并按照上面针对Interceptor详细说明的相同步骤操作.


Joo*_*gen 1

登录时,为用户提供一个生成的 ID/cookie(sessionid 就足够了),与用户数据一起存储。如果用户使用旧 ID/cookie 向服务器发出请求,则说明他在其他地方登录。

相反,禁止新的登录尝试也有其缺点 - 正如您所经历的那样。