首页 新闻 会员 周边

防止同一账号用户同时在不同地点登录

0
悬赏园豆:30 [已解决问题] 解决于 2010-05-10 16:31

为了防止同一个账号在不同的地点登陆到系统,在我的程序中,是这样处理的:

在数据库中用了一个标记为,标记用户的登录状态。

这样做在正常的情况下工作的还算是满意的,但是考虑另一种情况,当某一用户登录到了系统,这时登录状态为已经被置成了“登录”,在某种情况下,用户的浏览器崩溃了,或者电脑死机了等等造成了浏览器的以外关闭,此时,我的方法就不能正常工作了。虽然用户已经不在系统中了,但是由于浏览器是异常关闭的,数据库中的登录状态为仍然是“登录”的,这样一来,等用户下一次试图登录到系统时将导致失败。

 

这种情况下,该如何解决?或者有没有什么更好的方法可以防止同一账号在不同地点的同时登录问题?

Gavin Lipeng Ma的主页 Gavin Lipeng Ma | 初学一级 | 园豆:21
提问于:2010-05-06 14:36
< >
分享
最佳答案
0

要用这种做法,在后一个人登录的时候将前一个人挤掉,这样子就不会出现不正常了,使用sessionID和帐号就可以实现了:http://www.cnblogs.com/heaiping/archive/2010/01/19/1651835.html

楼主可以看一下,这篇文章,里面有代码实现

收获园豆:20
小AI | 菜鸟二级 |园豆:354 | 2010-05-06 15:22
这个方法可以解决部分问题,但是我希望的是能够阻止后登陆的用户,如果是让后登陆的用户把当前已经登录的用户挤掉,我觉得还是不是很合理。
Gavin Lipeng Ma | 园豆:21 (初学一级) | 2010-05-06 16:04
@Martin Mar:QQ,不就是这么做的吗
小AI | 园豆:354 (菜鸟二级) | 2010-05-06 19:05
试问一下,如果前一个用户是非法登录进去的,怎么办
小AI | 园豆:354 (菜鸟二级) | 2010-05-06 19:06
@贺爱平:那后一个是非法的呢?就把前一个合法的挤掉了。
Gavin Lipeng Ma | 园豆:21 (初学一级) | 2010-05-08 14:12
其他回答(3)
0

服务端

维护一个登陆用户的列表,需要由一个唯一的标示:

如:userID ,GUID(唯一标示),lastupdatetime

用户登陆的时候:先检测列列表,如果userid存在的话,将这一列删掉

之后:

生成一个GUID,并且将GUID写到cookie里面去。

 

客户端:

ajax轮询,没几秒钟将当前用户信息(userid,guid发到服务器),如果信息不在集合里面(同时跟新状态),则提示掉线,关闭浏览器或直接跳出。

 

这只是大概思路,怎么做都行,如果不用及时通知的话,不用ajax轮询也可以,节约资源,不过这样不能够及时跟新用户状态

状态维护问题:

客户段可能会关闭浏览器,或者直接停电,当时服务端记录了用户还是登陆者的,这样就会出现问题。我们可以在body的onunload事件里面回调删除记录,但是页面之间的跳转就会出现问题的。

ajax轮询的时候,跟新列lastupdatetime,如果lastupdate列长时间的没有更新,那就可以当成掉线,不过轮询太占用资源,不知道优美更好的办法

收获园豆:10
LittlePeng | 园豆:3445 (老鸟四级) | 2010-05-06 16:10
0

能否跟用户的IP绑定起来?

重回起点 | 园豆:207 (菜鸟二级) | 2010-05-06 19:25
0

服务器建立队列,如果超过一定时间没和服务器联系,自动解锁;或者用高权限的人强制重置状态;

winzheng | 园豆:8797 (大侠五级) | 2010-05-07 13:24
服务器建立队列,如果超过一定时间没和服务器联系,自动解锁; 能具体说说怎么做吗?怎么样建立队列呢?
支持(0) 反对(0) Gavin Lipeng Ma | 园豆:21 (初学一级) | 2010-05-10 14:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册