【问题标题】:control user's online status in asp.net在asp.net中控制用户的在线状态
【发布时间】:2011-05-02 07:59:33
【问题描述】:

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

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

登录方法内部:

DateTime ltime=Datetime.now();

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

Session["logintime"]=ltime;

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

2)在每个受保护页面的Page_Onload()方法中,检查session中的登录时间是否等于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”登录,并且 "password=000",那么他现在在线。

然后 user2 尝试使用 “用户名=账单”和 "password=123",因为他的密码是 无效,所以他的请求被拒绝了。

user3 尝试登录 “用户名=账单”和 "password=000",因为他的密码是 有效,所以他可以选择 user1 离线。

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

【问题讨论】:

    标签: asp.net session


    【解决方案1】:

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

    对于通用的稳健解决方案,您需要将此信息保存在数据库中(如您所说明的那样)。我不明白根据会话检查登录时间的目的。对于正确的解决方案,

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

    第三步(作业)是可选的,因为您可以在 #2 中修改检查以查看登录尝试是否在上次访问时间的 n 分钟(其中 n > 会话超时)之后。

    【讨论】:

    • @VinayC:这是我的错,我更新了我的问题。请检查一下。:)_
    • @hguser,如果你登录成功后才在数据库中创建条目,则不需要检查。
    • 但是在步骤“登录时,如果数据库中存在同一用户的活动会话则用户无法登录”,这取决于他的密码是否正确,他可以强制登录用户离线。
    • @hguser,您的意思是说如果用户登录系统,那么他之前的会话将被停用?通常,不采用这种方法(例如银行网站,但当然,您可以根据需要选择不同的方法) - 原因之一是实施起来很昂贵 - 对于每个请求,如果当前会话,您需要检查 db是否处于活动状态。
    • 是的,所以我必须在每个页面中进行检查,这会导致代码重复,有什么办法可以解决吗?
    【解决方案2】:

    为了检查用户是否已经在线的逻辑,我可能想把它放在Global.asax Application_AcquireRequestState 事件中,因为所有页面都受到保护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多