我如何知道哪个用户的会话id已经过期(以及哪些用户在线?)
本文关键字:用户 在线 过期 何知道 会话 id | 更新日期: 2023-09-27 18:16:27
我正在开发一个在线象棋游戏。在用户按下登录按钮后,我将userid
保存在会话变量中:
Session["userID"] = userId.Text;
赋值后,用户被转移到另一个页面。
可能有多个用户同时在线。假设有三个用户同时在线,在会话变量中,一个用户包含"1"userId,下一个包含"2"等等。
如果其中一个用户的会话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。结束事件来捕捉那个