我正在尝试实现这样的功能,当用户在一个地方登录时,当他尝试登录到其他地方时,他应该自动从前一个地方注销。
就像在 GMAIL..
如果有人可以给我这个概念,因为我认为我需要将用户登录状态保存在 Db 中,因为会话看起来没有帮助。但是我不明白我们如何更新数据库中的用户状态,如果在 5 分钟内没有活动(我将如何捕获数据库中的不活动和更新)。
如果有人可以请指导,我现在已经为此苦苦挣扎了几个小时。
谢谢
我正在尝试实现这样的功能,当用户在一个地方登录时,当他尝试登录到其他地方时,他应该自动从前一个地方注销。
就像在 GMAIL..
如果有人可以给我这个概念,因为我认为我需要将用户登录状态保存在 Db 中,因为会话看起来没有帮助。但是我不明白我们如何更新数据库中的用户状态,如果在 5 分钟内没有活动(我将如何捕获数据库中的不活动和更新)。
如果有人可以请指导,我现在已经为此苦苦挣扎了几个小时。
谢谢
当用户登录时,将带有 id 的用户会话添加到哈希图中。当同一用户再次登录时,检查 HashMap 中的条目,如果可用,则使会话无效并为用户创建新会话。
如果您使用的是 Spring Security,它提供了开箱即用的此功能。否则:
创建一个java.util.Map
(首选 ConcurrentMap,因此同时操作它不会损坏它),并将其存储在应用程序范围(ServletContext)中。
现在,您将在地图中登录时存储每个用户及其会话的引用,如果用户再次登录,只需获取先前的会话对象并使其无效。
现在实现 的实例javax.servlet.http.HttpSessionListener
,并在void sessionDestroyed(javax.servlet.http.HttpSessionEvent httpSessionEvent);
方法中从 Map 中删除指定的会话。(无论是由容器自动完成还是以编程方式执行,都会在会话失效时调用此侦听器)。只需注册这个监听web.xml
器,一切就完成了。
ps 我知道,如果您将应用程序部署在 Web 容器集群上,这会有点困难,但是当您只有一个服务器时,没关系。ps 我不建议将会话信息存储在数据库中。