0

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

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为空时,视图状态也为空。我能做些什么?

4

3 回答 3

2

如果Response.redirect使用,则无法跨页面访问 ViewState。尝试使用Server.transfer

检查访问 ViewState 跨页面了解更多信息。

于 2012-05-23T13:14:32.167 回答
1

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

这样,您将与当前身份进行交互以获取用户信息,而不是自定义信息存储。

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

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

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

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

于 2012-05-23T17:36:53.507 回答
0

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

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)
    {
    }
}
于 2012-05-23T12:59:20.970 回答