我如何知道哪个用户的会话id已经过期(以及哪些用户在线?)

本文关键字:用户 在线 过期 何知道 会话 id | 更新日期: 2023-09-27 18:16:27

我正在开发一个在线象棋游戏。在用户按下登录按钮后,我将userid保存在会话变量中:

     Session["userID"] = userId.Text;

赋值后,用户被转移到另一个页面。

可能有多个用户同时在线。假设有三个用户同时在线,在会话变量中,一个用户包含"1"userId,下一个包含"2"等等。

如果其中一个用户的会话Id由于某种原因过期,我如何知道哪个用户的会话过期?

原因是我想告诉其他用户这个特定的用户已经不在线了

我如何知道哪个用户的会话id已经过期(以及哪些用户在线?)

我如何知道哪个用户会话变量过期了?

可以订阅SessionStateModule。事件:

  public class KyuApplication : System.Web.HttpApplication
  {
    public override void Init()
    {
        SessionStateModule session = Modules["Session"] as SessionStateModule;
        if (session != null)
        {
            session.Start += new EventHandler(Session_Start);
            session.End += new EventHandler(Session_End);
        }
    }
    private void Session_Start(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Session_Start");
    }
    private void Session_End(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Session_End");
    }
}

示例来自:http://johnllao.wordpress.com/2009/06/05/session_start-and-session_end-event-from-custom-httpapplication/

原因是我想向其他用户显示这个特定的用户不再在线

你的方法是不必要的。Asp。Net会员框架为您提供了此功能,因此您不必自己构建它。您可以使用MembershipUser。IsOnline为您做这件事

来自MSDN的示例:

  MembershipUserCollection users;
  public void Page_Load()
  {
     users = Membership.GetAllUsers();
     if (!IsPostBack)
     {
        // Bind users to ListBox.
        UsersListBox.DataSource = users;
        UsersListBox.DataBind();
     }

     // If a user is selected, show the properties for the selected user.
     if (UsersListBox.SelectedItem != null)
     {
          MembershipUser u = users[UsersListBox.SelectedItem.Value];
          EmailLabel.Text = u.Email;
          IsOnlineLabel.Text = u.IsOnline.ToString();
          LastLoginDateLabel.Text = u.LastLoginDate.ToString();
          CreationDateLabel.Text = u.CreationDate.ToString();
          LastActivityDateLabel.Text = u.LastActivityDate.ToString();
     }
 }     

这里有一些其他的博客文章更详细地讨论了这个问题,并描述了如何设置它:

  • http://dotnetslackers.com/articles/aspnet/tracking-user-activity.aspx
  • http://blog.dreamlabsolutions.com/post/2009/07/13/ASPNET-Membership-Show-list-of-users-online.aspx

会话数据对用户来说是私有的,不能被应用程序的其他部分(即用户上下文之外的部分)访问。这意味着使用会话做你想做的事情将是困难和尴尬的。

一个更好的选择是在一个单独的数据结构中跟踪用户活动,并将其保存在web服务器的内存中(使用静态变量或System.Web.Caching命名空间)或数据库中。

对于每个用户,您都可以将会话信息保存在远程存储(例如数据库)中,其中包含到期日期(必须大于应用程序配置中的会话到期日期)和userID绑定,并且在用户在应用程序中进行某些操作后,您可以通过添加一些值来更改到期日期。因此,在这种情况下,您总是有未过期的会话列表,由您控制。
使用Session变量-您可以看到有关客户机当前请求的会话信息。因此,使用这个变量,你肯定无法看到其他用户的会话,这将是不安全的。

你可以使用SessionStateModule。结束事件来捕捉那个