我们有一个使用struts2开发的网络应用程序,spring&冬眠。
应用程序需要一个用户只能从一个浏览器登录的功能。
如果用户x登录了pc-1浏览器ff,那么他就无法从任何其他地方登录。
我通过实现会话映射尝试了它并将会话存储在全局映射中,但是当用户注销并尝试再次登录时,这会失败。
如果用户没有注销和会话超时,即使它严重失败,但地图也没有清除。
更好地实现此功能。
我们不希望阻止用户登录,但不希望用户通过允许用户共享信用卡并允许多个用户进行相同登录来利用该应用程序。
答案 0 :(得分:13)
由于您已经在使用Spring,我建议您将应用程序与Spring Security集成。
Spring安全性允许您同时定义每个用户允许的最大会话数。
<session-management>
<concurrency-control max-sessions="1" />
</session-management>
如果在具有有效会话的用户尝试再次登录时设置,则会通知用户最大并发访问权限设置为1.
了解更多at。
如果弹簧安全性不适合您,那么:
使用会检查会话有效性的SessionInterceptor
,如果会话有效,它将检查用户是否已登录到应用程序(为此,您必须在某处维护会话,例如数据库每次成功登录),如果找到有效登录,再次将用户重定向到带有自定义消息的登录页面,或者注销已经有效的会话,然后再将其重定向到登录状态。如果您注销早期会话,则意味着该浏览器会话中的任何连续操作都必须处理无效会话。
如果您在应用程序中也使用Servlet
,那么Interceptor将无法为您工作,在这种情况下,您应该使用Filter
并按照上面针对Interceptor详细说明的相同步骤操作。
答案 1 :(得分:1)
在登录时,为用户提供与用户数据一起存储的生成ID / cookie(sessionid就足够了)。如果用户使用旧ID / cookie向服务器发出请求,请说他已在其他位置登录。
另一方面,禁止新登录尝试,有其缺点 - 正如您所经历的那样。
答案 2 :(得分:1)
最佳解决方案是在用户登录新会话时从其他会话中注销用户。通常,用户在关闭浏览器时不会注销并限制他登录其他窗口将是陷阱。
自动关闭之前的所有用户会话都很好,因为在正常使用情况下,没有问题,但是在共享登录名和密码时,没有两个人可以同时使用您的应用程序。
答案 3 :(得分:1)
创建地图。 在记录时检查用户ID是否存在于该映射中。 如果它不存在则将用户id放入map中,在注销时删除该用户id。
答案 4 :(得分:0)
说实话,我会重新审视您必须将用户限制为单次登录的原因。虽然阻止他们从两个不同的浏览器登录是很容易的 - 提供的任何建议都可行 - 如果可以的话,Spring Security选项最容易实现 - 当用户在同一个用户打开第二个标签时它们都会崩溃浏览器。这被认为是同一会议的一部分。
答案 5 :(得分:0)
在servlet上下文中维护用户堆栈,因为它将是web容器的一个。在用户登录之前执行检查,如果在servlet上下文中找到用户名将其重定向到登录页面。
答案 6 :(得分:0)
所有您需要做的就是在数据库用户配置文件表中添加一个字段: alreadyLogin 。 如果用户登录,则将其设置为Y。如果用户注销,则将其设置为N。现在,每次用户尝试从新位置登录时,请检查此值,如果Value为Y,则阻止登录。