如何在asp.net中检查会话是否过期

时间:2012-05-07 10:00:10

标签: c# asp.net

我在web.config文件中指定了会话超时。当会话超时时,我没有重定向到登录页面,但是我收到错误,指出对象引用未设置为实例。

有人可以告诉我解决方案吗?

8 个答案:

答案 0 :(得分:16)

您可以查看HttpContext.Current.User.Identity.IsAuthenticated属性,以便了解是否有当前经过身份验证的用户。

答案 1 :(得分:11)

修改

您可以使用IsNewSession属性来检查会话是否是根据页面请求创建的

protected void Page_Load() 
{ 
   if (Context.Session != null) 
   { 
      if (Session.IsNewSession) 
      { 
         string cookieHeader = Request.Headers["Cookie"]; 
         if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
         { 
            Response.Redirect("sessionTimeout.htm"); 
         } 
      } 
   } 
}

<强>预

当用户登录网站时将userid存储在会话变量中,并检查您的母版页或创建的基页形式,其他页面继承...并在页面加载中检查用户ID是否存在(如果不是重定向到登录)页面

if(Session["Userid"]==null)
{
  //session expire redirect to login page 
}

答案 2 :(得分:8)

我不想在代码中检查会话变量而是使用FormAuthentication。它们具有内置功能,可以重定向到web.config中指定的给定LoginPage。

但是,如果要显式检查会话,可以检查先前在Pranay回答时在会话中创建的任何变量的NULL值。

您可以创建Login.aspx页面并在那里写入您的消息,当会话到期时FormAuthentication自动重定向到FormAuthentication部分中给出的loginUrl

<authentication mode="Forms">
  <forms loginUrl="Login.aspx" protection="All" timeout="30">
  </forms>
</authentication>

问题是你无法为Login和SessionExpire提供单独的页面,因此你必须在Login.aspx上显示/隐藏某些部分以便双向行动。

还有另一种方法可以在超时后重定向到sessionexpire页面而不更改formauthentication-&gt; loginurl,请参阅以下链接:http://www.schnieds.com/2009/07/aspnet-session-expiration-redirect.html

答案 3 :(得分:7)

使用Session.Contents.Count

if (Session.Contents.Count == 0)
{
    Response.Write(".NET session has Expired");
    Response.End();
}
else
{
    InitializeControls();
}

以上代码假设您在用户首次访问您的网站时至少创建了一个会话变量。如果您没有,那么您很可能没有为您的应用使用数据库。对于您的情况,您可以使用以下示例手动分配会话变量。

protected void Page_Load(object sender, EventArgs e)
{
    Session["user_id"] = 1;
}

祝你好运!

答案 4 :(得分:6)

检查它是否为空,例如

if(Session["mykey"] != null)
{
  // Session is not expired
}
else
{
  //Session is expired
}

答案 5 :(得分:2)

我使用@Adi-lester答案并添加一些方法。

验证会话是否活着的方法

public static void SessionIsAlive(HttpSessionStateBase Session)
{
    if (Session.Contents.Count == 0)
    {
        Response.Redirect("Timeout.html"); 
    }
    else
    {
        InitializeControls();
    }
}

在页面加载

中创建会话var
protected void Page_Load(object sender, EventArgs e)
{
    Session["user_id"] = 1;
}

创建SaveData方法(但您可以在所有方法中使用它)

protected void SaveData()
{
    // Verify if Session is Alive
    SessionIsAlive(Session);

    //Save Data Process
    // bla
    // bla
    // bla
}

答案 6 :(得分:2)

这种方式很多人检测到会话已经过期了。以下代码可以帮助你。

protected void Page_Init(object sender, EventArgs e)
    {
        if (Context.Session != null)
        {
            if (Session.IsNewSession)
            {
                HttpCookie newSessionIdCookie = Request.Cookies["ASP.NET_SessionId"];
                if (newSessionIdCookie != null)
                {
                    string newSessionIdCookieValue = newSessionIdCookie.Value;
                    if (newSessionIdCookieValue != string.Empty)
                    {
                        // This means Session was timed Out and New Session was started
                        Response.Redirect("Login.aspx");
                    }
                }
            }
        }
    }

答案 7 :(得分:1)

这里我正在检查会话值(前一页的文本框中填写了两个值)

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["sessUnit_code"] == null || Session["sessgrcSerial"] == null)
    {
        Response.Write("<Script Language = 'JavaScript'> alert('Go to GRC Tab and fill Unit Code and GRC Serial number first')</script>");
    }
    else
    {

        lblUnit.Text = Session["sessUnit_code"].ToString();
        LblGrcSr.Text = Session["sessgrcSerial"].ToString();
    }
}