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

本文关键字:会话 是否 过期 检查 asp net | 更新日期: 2023-09-27 18:33:26

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

谁能告诉我解决方案?

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

您可以检查 HttpContext.Current.User.Identity.IsAuthenticated 属性,该属性将允许您知道当前是否存在经过身份验证的用户。

Edit

可以使用 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存储在会话变量中,其他页面将继承。然后在页面加载中检查Userid是否存在,如果不存在,则重定向到登录页面。

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

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

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

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

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

问题是你不能为登录和会话过期提供单独的页面,所以你必须显示/隐藏登录上的一些部分.aspx以两种方式进行操作。

还有另一种方法可以在超时后重定向到会话过期页面,而无需更改formauthentication->loginurl,请参阅以下链接: http://www.schnieds.com/2009/07/aspnet-session-expiration-redirect.html

使用 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;
}

祝你好运!

检查它是否为空,例如

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

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

验证会话是否处于活动状态的方法

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

在页面加载中创建会话变量

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
}
这样

许多人就会检测到会话是否已过期。 下面的代码可能会对你有所帮助。

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");
                    }
                }
            }
        }
    }

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

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();
    }
}