该解决方案是在ASP.NET下解决的,创建一个用户登录表,记录下每一个用户登录系统的信息,其表结构如下:
字段 | 类型 | 说明 |
User_id | Varchar(22) | 用户ID号 |
User_address | Varchar(15) | 用户访问系统时的IP地址 |
Last_datetime | Datetime | 用户最后访问系统的时间 |
Login_status | Int | 用户在线状态 0:离线 1:在线 |
一.在创建用户的时候,向登录表中自动添加一条信息(注意:初始化信息要确保其在线状态为0,即离线状态)
二.在用户登陆的时候,User_address记录下用户使用的计算机的IP地址,Login _status被设置为1,系统将事实记录下用户操作系统时的时间到last_datetime中,退出的时候将把该状态设置为0。如果用户是正常退出,则该状态可以正常的设置为0,但是如果用户时非法退出系统,服务器端没有办法得到客户端退出的消息,则Login_status仍然为1,所以下次用户登录的时候就不能只凭Login_status来判断用户是否在线。我是利用Use_addrss和Last_status这两个字段来解决的,我的具体解决方法是:
1.验证登录,该伪代码为:
If (当前用户IP地址上是否有其他已经登录的用户)
Begin
If(用户登录帐号是否是本地计算机上已经登录的用户)
允许登录;
Else
ShowMessage(“已经有其他用户在本机登录!”);
End
Else
Begin
If(用户是否已经登录)
ShowMessage(“该用户已经登录,请稍后再试!”);
Else
允许登录
End
说明:
1判断用户所在计算机是否还有其他用户是否已经登录,从而使得一台计算机也只能同时登录一个用户
2判断用户登录帐号是否是本地计算机上已经登录的用户,使得用户如果非法退出系统,仍然可以使用原来登录的帐号继续登录。
3如果本地计算计算机没有其他登录的用户,就判断登录的帐号是否已经在其他计算机上登录,如果没有,才可以登录,这样就保证了同一个帐号无法使多个用户同时登录。
先判断Login_status是否为0,如果为1,则再判断当前时间与用户最后一次访问时间之差是否大于你所限制的Session对象的超时时间,如果大于,则说明上次使用该帐号登录的用户已经离线,可以登录,否则不允许登录
2.更新用户最后一次访问系统的时间:
在ASP.NET中,有Application_EndReqest事件,每一个用户在客户端对系统做任何事情,都会响应该事件,所以可以时时获取用户最后一次访问系统的时间,将该时间更新到系统登录表中的Last_datetime字段中。在Applicatin_EndRequest事件中,不能使用Session变量,所以只能获取用户的IP地址,和服务端限制的Session对象的超时事件限制。
因为前面已经提到,每台计算机只能同时有一个用户登录,所以,可以根据用户的IP地址,得到最后一个在本机使用的用户帐号user_id,该用户如果Login_status=1,并且last_datetime与当前时间之差小于所限制的时间长,则说明当前在线的用户就是该帐号,则更新该访问时间。