关于重复登陆的问题,如何使得先前登录的用户强制退出。

时间:2022-10-13 14:44:40
本人菜鸟望各位大侠不要见笑:
    本人做登陆画面,先前比较传统的用户ID和密码验证不说,说说我遇到的问题:
        
        本人想限制用户的重复登陆,(判断重复登陆的代码已经完成),但是当我判断出用户重复登陆后,我想让先前登录的那个人强制退出,让自己强制登陆。请问如何实现?
        谢谢

14 个解决方案

#1


难道不是session嘛?

#2


用户桌面数据中保存最后的登陆时间,
所有登录的session在登陆时保存一个登陆时间,
每次访问相应的连接,都对数据库中的登陆时间和session中的登陆时间做对比,
如果,数据库中的登陆时间比session中的登陆时间早,证明有人从另一台电脑重新登陆,就可以提示相应的信息。
类似于MSN(MSN是基于web的聊天软件)。

但是,大多数web程序不需要这种功能,MSN比较特殊。

#3


回2楼:在我所了解的范围内,session是基于对话的,也就是我本机登陆和别人用别的机器远程登录属于不同的对话,如果这边可以或的别人的会话的话那么这个问题应该比较简单,但是我不知道如何获取别的登录用户的session,期待指教。



回3楼:在概要设计阶段没有设计数据库用户表中有一个登陆时间的字段。不好意思





清大家踊跃发言。。谢谢啊

#4


估计需要在数据库中添加字段,保存用户登陆状态(true,false)
session连接时,判断是否登陆,为true时,说明已经登陆。进行处理
                             为False时,没有登陆,可以登陆
session关闭时,将登陆状态设置成false。

注意同步机制的使用。

#5


回4楼:大哥,,如果概要设计时候数据库设计能有这个字段,我就没那么多烦恼啦。。唉。。。

#6


如果不能用数据库,写文件好了

#7


引用 3 楼 howloncampus 的回复:
回2楼:在我所了解的范围内,session是基于对话的,也就是我本机登陆和别人用别的机器远程登录属于不同的对话,如果这边可以或的别人的会话的话那么这个问题应该比较简单,但是我不知道如何获取别的登录用户的session,期待指教。


回3楼:在概要设计阶段没有设计数据库用户表中有一个登陆时间的字段。不好意思


清大家踊跃发言。。谢谢啊


1.返回概要设计,修改数据库!
2.contenxt全域管理用户登录时间——方法类似用数据库管理

#8


回楼上:我已经用Application实现了判断用户是否重复登录的功能了。。。。现在我要做的是想让远程登录的人强制下线。。。例如:你在苏州用我的帐号登录了,,,但是我现在在无锡也在用同样的帐号登录同一个系统,我现在已经能判断出来此帐号已经在苏州登录了,我需要作的是想让你强制下线,请问如何实现?

#9


引用 8 楼 howloncampus 的回复:
回楼上:我已经用Application实现了判断用户是否重复登录的功能了。。。。现在我要做的是想让远程登录的人强制下线。。。例如:你在苏州用我的帐号登录了,,,但是我现在在无锡也在用同样的帐号登录同一个系统,我现在已经能判断出来此帐号已经在苏州登录了,我需要作的是想让你强制下线,请问如何实现?

清除session,返回相应的信息

UI方面就靠你的客户端了,要么javascript要么其他什么客户端程序。
如果还不理解,重新理解一下HTTP通信协议

#10


清除session?你这个session在哪?客户端的session你是清不了的,不用异地,你自己机器开2个窗口看看能不能清

#11


顶楼上。 怎么得到其他用户的session。 有没有达人告知。

#12


应该是每次在验证session的之前首先验证登陆地,就是说如果帐号在别处登陆了,即使我的session中是登陆状态,也要看成是退出状态,并且清除session中保留的信息

#13


回楼上  你说的都知道,问题是怎么实现。 问题归结为,怎么拿到别人的session然后改状态。

#14


我觉得可以这样做。首先在ServletContext中存放一个Map,key为登陆名,value为该用户对应的Session(在ServletContextListener中做这件事),之后只要有用户登陆就根据该用户的登陆名到Map中去查一下,发现已经有Session的就让它失效(调用invalidate()),之后再将新的Session放到Map中。并且在你的web应用中加一个Filter,用于检查Session中是否有用户登陆信息,没有则强制返回登陆页面(由于调用了Session的invalidate()方法,肯定将先登陆用户的Session中的用户信息去除了)。

#1


难道不是session嘛?

#2


用户桌面数据中保存最后的登陆时间,
所有登录的session在登陆时保存一个登陆时间,
每次访问相应的连接,都对数据库中的登陆时间和session中的登陆时间做对比,
如果,数据库中的登陆时间比session中的登陆时间早,证明有人从另一台电脑重新登陆,就可以提示相应的信息。
类似于MSN(MSN是基于web的聊天软件)。

但是,大多数web程序不需要这种功能,MSN比较特殊。

#3


回2楼:在我所了解的范围内,session是基于对话的,也就是我本机登陆和别人用别的机器远程登录属于不同的对话,如果这边可以或的别人的会话的话那么这个问题应该比较简单,但是我不知道如何获取别的登录用户的session,期待指教。



回3楼:在概要设计阶段没有设计数据库用户表中有一个登陆时间的字段。不好意思





清大家踊跃发言。。谢谢啊

#4


估计需要在数据库中添加字段,保存用户登陆状态(true,false)
session连接时,判断是否登陆,为true时,说明已经登陆。进行处理
                             为False时,没有登陆,可以登陆
session关闭时,将登陆状态设置成false。

注意同步机制的使用。

#5


回4楼:大哥,,如果概要设计时候数据库设计能有这个字段,我就没那么多烦恼啦。。唉。。。

#6


如果不能用数据库,写文件好了

#7


引用 3 楼 howloncampus 的回复:
回2楼:在我所了解的范围内,session是基于对话的,也就是我本机登陆和别人用别的机器远程登录属于不同的对话,如果这边可以或的别人的会话的话那么这个问题应该比较简单,但是我不知道如何获取别的登录用户的session,期待指教。


回3楼:在概要设计阶段没有设计数据库用户表中有一个登陆时间的字段。不好意思


清大家踊跃发言。。谢谢啊


1.返回概要设计,修改数据库!
2.contenxt全域管理用户登录时间——方法类似用数据库管理

#8


回楼上:我已经用Application实现了判断用户是否重复登录的功能了。。。。现在我要做的是想让远程登录的人强制下线。。。例如:你在苏州用我的帐号登录了,,,但是我现在在无锡也在用同样的帐号登录同一个系统,我现在已经能判断出来此帐号已经在苏州登录了,我需要作的是想让你强制下线,请问如何实现?

#9


引用 8 楼 howloncampus 的回复:
回楼上:我已经用Application实现了判断用户是否重复登录的功能了。。。。现在我要做的是想让远程登录的人强制下线。。。例如:你在苏州用我的帐号登录了,,,但是我现在在无锡也在用同样的帐号登录同一个系统,我现在已经能判断出来此帐号已经在苏州登录了,我需要作的是想让你强制下线,请问如何实现?

清除session,返回相应的信息

UI方面就靠你的客户端了,要么javascript要么其他什么客户端程序。
如果还不理解,重新理解一下HTTP通信协议

#10


清除session?你这个session在哪?客户端的session你是清不了的,不用异地,你自己机器开2个窗口看看能不能清

#11


顶楼上。 怎么得到其他用户的session。 有没有达人告知。

#12


应该是每次在验证session的之前首先验证登陆地,就是说如果帐号在别处登陆了,即使我的session中是登陆状态,也要看成是退出状态,并且清除session中保留的信息

#13


回楼上  你说的都知道,问题是怎么实现。 问题归结为,怎么拿到别人的session然后改状态。

#14


我觉得可以这样做。首先在ServletContext中存放一个Map,key为登陆名,value为该用户对应的Session(在ServletContextListener中做这件事),之后只要有用户登陆就根据该用户的登陆名到Map中去查一下,发现已经有Session的就让它失效(调用invalidate()),之后再将新的Session放到Map中。并且在你的web应用中加一个Filter,用于检查Session中是否有用户登陆信息,没有则强制返回登陆页面(由于调用了Session的invalidate()方法,肯定将先登陆用户的Session中的用户信息去除了)。