每个用户只允许一个会话

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

应用程序需要一个用户只能从一个浏览器登录的function。

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

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

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

任何更好的想法来实现此function。

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

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

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

   

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

阅读更多内容。

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

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

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

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

反过来,禁止新登录尝试,有其缺点 – 正如您所经历的那样。

最佳解决方案是在用户登录新会话时从其他会话注销用户。 通常用户在关闭浏览器时不会注销并限制他登录其他窗口将是陷阱。

自动关闭任何以前的用户会话是好的,因为在正常使用中,没有问题,但是当共享登录名和密码时,没有两个人可以同时使用您的应用程序。

创建一个地图。 在记录时检查用户ID是否存在于该映射中。 如果它不存在则将用户id放入map中,在注销时删除该用户id。

说实话,我会重新审视您必须将用户限制为单一登录的原因。 虽然阻止他们从两个不同的浏览器登录是很容易的 – 提供的任何建议都可行 – 如果可以的话,Spring Security选项最容易实现 – 当用户在同一个用户打开第二个标签时它们都会崩溃浏览器。 这被认为是同一会议的一部分。

在servlet上下文中维护用户堆栈,因为它将是web容器的一个。在用户登录之前执行检查,如果在servlet上下文中找到用户名将其重定向到登录页面。