我正在开发一款在线国际象棋游戏。用户按下登录按钮后,我将userid
保存在会话变量中:
Session["userID"] = userId.Text;
分配变量后,用户将转移到另一个页面。
有可能一次有多个用户在线。假设三个用户一次在线,在会话变量中一个用户包含“1”userId,其次包含“2”等等。
如果某个用户的会话ID由于某种原因而过期,我如何知道哪个用户的会话已过期?
原因是我想向其他用户显示此特定用户不再在线。
答案 0 :(得分:0)
会话数据对用户来说是私有的,并不意味着可以被应用程序的其余部分访问(即,在用户的上下文之外)。这意味着使用会话做你想做的事情会变得困难和尴尬。
更好的选择是在单独的数据结构中跟踪用户活动,并将其保存在Web服务器的内存中(使用静态变量或System.Web.Caching命名空间)或数据库中。
答案 1 :(得分:0)
您可以使用SessionStateModule.End事件来捕获它。
答案 2 :(得分:0)
对于每个用户,您可以将会话信息保存在远程存储(例如数据库)中,其中包含到期日期(必须大于应用程序配置的会话到期日期)和userID绑定,并且在用户在您的应用程序中执行某些操作后可以通过添加一些值来更改到期日期。因此,在这种情况下,您始终拥有由您控制的未过期会话列表
使用Session
变量 - 您可以查看来自客户端的当前请求的会话信息。因此,只使用此变量,您肯定无法看到其他用户'会议,这将是不安全的。
答案 3 :(得分:0)
我如何知道哪个用户会话变量已过期?
您可以订阅SessionStateModule.End事件:
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");
}
}
原因是我想向其他用户显示此特定用户不再在线。
你的方法是不必要的。 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();
}
}
以下是一些其他博客文章,详细讨论了这些内容并描述了如何设置它: