控制用户在asp.net中的在线状态

时间:2011-05-02 07:59:33

标签: asp.net session

我的应用程序我不希望同时登录相同的用户名,所以我有想法,但我不确定它是否正确。

1)当用户登录时,更新状态(db中用户表中的“isOnLine”列)并将其登录时间保存在会话中,如:

登录方法内:

DateTime ltime=Datetime.now();

Dbservice.executeSql(update User set(isOnLine,lastLoginTime) value("1",ltime));

Session["logintime"]=ltime;

当其他用户尝试登录时,请检查该表以查看该用户的状态是否已登录。如果是,请将“isOnline”设置为“0”,然后他就可以立即登录。

2)在每个受保护页面的Page_Onload()方法中,检查会话中的登录时间是否等于db中的时间:

string logtime=Dbservice.executeSelect("select lastLoginTime from user where xxxxx").Rows[0]["lastLoginTime"];

if(!Session["logintime"]==logtime){

  //this user should offline now,redirect it to the login page

}

我想知道我的方式是否正确?

另外,我必须在每个受保护页面的Page_onLoad方法中编写检查逻辑,因此有很多重复代码,有什么想法可以避免这种情况吗?

由于我们网站中的所有页面都受到保护!。

感谢。

更新:

不允许两个用户同时在线,但允许具有正确密码的后一个用户可以强制前一个用户离线。例如:

  

user1登录“username = bill”和   “密码= 000”,然后他现在在线。

     

然后user2尝试登录   “username = bill”和   “password = 123”,因为他的密码是   无效,所以他的请求被拒绝。

     

user3尝试登录   “username = bill”和   “password = 000”,因为他的密码是   有效,所以他可以选择   user1离线。

在这种情况下,当后来的用户登录成功,但前用户的会话也存在时,我必须根据会话中的“登录时间”检查是否在线。

2 个答案:

答案 0 :(得分:1)

如果您不打算使用Web场(或Web园)场景,则可以使用内存结构来跟踪已登录的用户。例如,字典类型的静态全局变量(以线程安全的方式访问)。

对于通用健壮的解决方案,您需要将此信息保存在数据库中(如您所示)。我还没有理解检查会话登录时间的目的。为了正确解决方案,

  1. 您需要一个能够跟踪用户会话的数据库表。重要字段将是上次访问时间和活动/非活动状态。
  2. 在登录时,如果db中存在同一用户的活动会话,则用户无法登录
  3. 在特定超时后将会话标记为非活动的作业。此超时必须略大(比如x分钟),而不是Web服务器会话超时。
  4. 从应用程序代码定期刷新以重置db中上次访问的值,以便作业不会将会话标记为非活动状态。
  5. 因为db超时= Web服务器超时+ x,您可以刷新x分钟,减少数据库跳闸。例如,假设x = 3分钟,那么3分钟内的所有请求将不会修改数据库中的最后访问时间(通过减少数据库跳闸)。您可以跟踪会话状态中的最后数据库更新时间,并在每个请求中检查此值以查看数据库是否需要更新(即当前时间>上次数据库更新+ x然后更新数据库中最后访问的值)。
  6. 第三步(作业)是可选的,因为您可以修改#2中的检查以查看登录尝试是否在上次访问时间的n分钟(其中n>会话超时)之后。

答案 1 :(得分:0)

对于检查用户是否已在线的逻辑,我可能希望将其置于Global.asax Application_AcquireRequestState事件中,因为所有页面都受到保护。