从视图状态获取值,以防会话过期

本文关键字:会话 过期 视图状态 获取 | 更新日期: 2023-09-27 18:35:10

我的项目中有很多页面。在我写的所有页面中:

if (!IsPostBack)
{     
   if (HttpContext.Current.Session["curUserRole"] == null)
   {
      DBUsers.SetUserStatusOnline("0", ViewState["curUserLogin"].ToString());
      ViewState["curUserLogin"] = "";
      Response.Redirect("~/Login.aspx");
   }
   else
   {       
      ViewState["curUserLogin"] = HttpContext.Current.Session["curUserLogin"].ToString();
      DBUsers.SetUserStatusOnline("1", ViewState["curUserLogin"].ToString());
   }
}

当用户登录到站点时,当前用户角色将写入会话,当前用户登录名将写入视图状态。会话完成后,我认为我可以在视图状态中查看当前用户登录并在数据库中设置脱机状态。但是,当session为空时,视图状态也为空。我能做什么?

从视图状态获取值,以防会话过期

如果使用

Response.redirect,则无法跨页面访问视图状态。 尝试使用Server.transfer

有关详细信息,请查看跨页面访问视图状态。

使用表单身份验证不是比手动处理角色、视图状态和会话更好的方法吗?

这样,您就可以与当前标识进行交互以获取用户信息,而不是自定义信息存储。

而且我认为您可能不应该依赖用户的回发来确定会话是否已过期。如果用户只是关闭浏览器怎么办?他/她将无限期地保持"在线"。

您应该为用户提供手动注销的机制。

现在,如果您将 InProc 用于会话状态,则可以在 global.asax 中处理Session_End,以将该用户设置为数据库中的"脱机"。如果您使用的是 StateServer 或 SQLServer,则不会在超时时调用Session_End,您必须以自定义方式处理它,例如通过数据库服务器上的计划任务将用户标记为脱机。

现在,如果您确实需要非常精确地控制在线/离线状态,则可能需要采用更复杂的方法。一种选择是,每当用户执行任何操作时,在 User 表上存储最后一个活动的日期时间。并将在特定时间内未执行任何活动的任何用户视为脱机。另一种选择是用作保持活动调用的 ajax 调用来更新上面提到的日期时间。

除了UnhandledException的答案之外,我还要补充一点,最好将逻辑集中在一个类中,然后从该新类派生页面,而不是将其剪切并粘贴到每个页面:

public class MyPageClass : System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
        // Add your logic here.
        base.OnLoad(e);
    }
}
public class WebPage1 : MyPageClass
{  
    private void Page_Load(object sender, System.EventArgs e)
    {
    }
}