为了防止同一个账号在不同的地点登陆到系统,在我的程序中,是这样处理的:
在数据库中用了一个标记为,标记用户的登录状态。
这样做在正常的情况下工作的还算是满意的,但是考虑另一种情况,当某一用户登录到了系统,这时登录状态为已经被置成了“登录”,在某种情况下,用户的浏览器崩溃了,或者电脑死机了等等造成了浏览器的以外关闭,此时,我的方法就不能正常工作了。虽然用户已经不在系统中了,但是由于浏览器是异常关闭的,数据库中的登录状态为仍然是“登录”的,这样一来,等用户下一次试图登录到系统时将导致失败。
这种情况下,该如何解决?或者有没有什么更好的方法可以防止同一账号在不同地点的同时登录问题?
要用这种做法,在后一个人登录的时候将前一个人挤掉,这样子就不会出现不正常了,使用sessionID和帐号就可以实现了:http://www.cnblogs.com/heaiping/archive/2010/01/19/1651835.html
楼主可以看一下,这篇文章,里面有代码实现
服务端
维护一个登陆用户的列表,需要由一个唯一的标示:
如:userID ,GUID(唯一标示),lastupdatetime
用户登陆的时候:先检测列列表,如果userid存在的话,将这一列删掉
之后:
生成一个GUID,并且将GUID写到cookie里面去。
客户端:
ajax轮询,没几秒钟将当前用户信息(userid,guid发到服务器),如果信息不在集合里面(同时跟新状态),则提示掉线,关闭浏览器或直接跳出。
这只是大概思路,怎么做都行,如果不用及时通知的话,不用ajax轮询也可以,节约资源,不过这样不能够及时跟新用户状态
状态维护问题:
客户段可能会关闭浏览器,或者直接停电,当时服务端记录了用户还是登陆者的,这样就会出现问题。我们可以在body的onunload事件里面回调删除记录,但是页面之间的跳转就会出现问题的。
ajax轮询的时候,跟新列lastupdatetime,如果lastupdate列长时间的没有更新,那就可以当成掉线,不过轮询太占用资源,不知道优美更好的办法
能否跟用户的IP绑定起来?
服务器建立队列,如果超过一定时间没和服务器联系,自动解锁;或者用高权限的人强制重置状态;