使会话在ASP.NET中正常过期

使会话在ASP.NET中正常过期,asp.net,session,redirect,Asp.net,Session,Redirect,在重定向到页面之前/之后,我需要一种方法告诉ASP.NET“终止当前会话并重新开始一个全新的会话” 以下是我想做的: 1) 在ASP.NET应用程序的母版页(或Global.asax)中检测会话何时过期 2) 如果会话已过期,请将用户重定向到一个页面,告诉他们会话已过期。在这个页面上,它将等待5秒钟,然后将用户重定向到应用程序的主页面,或者,如果他们愿意,他们也可以单击链接更快地到达主页面 3) 用户到达主页并再次开始使用该应用程序 好的,到目前为止,我已经介绍了步骤1和步骤2。我有一个函数,通

在重定向到页面之前/之后,我需要一种方法告诉ASP.NET“终止当前会话并重新开始一个全新的会话”

以下是我想做的:

1) 在ASP.NET应用程序的母版页(或Global.asax)中检测会话何时过期

2) 如果会话已过期,请将用户重定向到一个页面,告诉他们会话已过期。在这个页面上,它将等待5秒钟,然后将用户重定向到应用程序的主页面,或者,如果他们愿意,他们也可以单击链接更快地到达主页面

3) 用户到达主页并再次开始使用该应用程序

好的,到目前为止,我已经介绍了步骤1和步骤2。我有一个函数,通过使用IsNewSession属性和ASP.NET会话ID cookie值来检测会话到期。如果检测到过期会话,它将重定向,等待五秒钟,然后尝试转到主页

问题是,当它尝试重定向时,它会到达母版页中的部分以检测过期的会话,并返回true。我已经尝试调用Session.about()、Session.Clear(),甚至将Session设置为NULL,但都没有成功


以前肯定有人遇到过这个问题,所以我对社区有信心找到一个好的解决方案。提前感谢。

您所描述的问题之所以发生,是因为asp.net正在重用sessionid,如果调用放弃()时验证cookie中仍然存在sessionid,它将只是重用它,您需要显式创建一个新的sessionid afaik,类似于:

 HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId");
    mycookie.Expires = DateTime.Now.AddDays(-1);
    Response.Cookies.Add(mycookie);

您正在呼叫会话。是否在您的特殊“您的会话已过期”页面中放弃?如果是这样,就不要这样做。

添加cookie技巧对我也很有效,如下所示:

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Code that runs when a new session is started        
    If Session.IsNewSession Then
        'If Not IsNothing(Request.Headers("Cookie")) And Request.Headers("Cookie").IndexOf("ASP.NET_SessionId") >= 0 Then
        If Not IsNothing(Request.Headers("Cookie")) AndAlso Request.Headers("Cookie").IndexOf("ASP.NET_SessionId") >= 0 Then
            'VB code
            Dim MyCookie As HttpCookie = New HttpCookie("ASP.NET_SessionId")
            MyCookie.Expires = System.DateTime.Now.AddDays(-1)
            Response.Cookies.Add(MyCookie)

            'C# code
            'HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId");    
            'mycookie.Expires = DateTime.Now.AddDays(-1);    
            'Response.Cookies.Add(mycookie);

            Response.Redirect("/timeout.aspx")
        End If
    End If       
End Sub

对于ASP.NET MVC,这就是我使用action方法所做的

注:

  • 返回一个简单视图,其中没有可能意外重新创建会话的其他资源
  • 我返回当前时间和会话id,以便您可以验证操作是否成功完成

    public ActionResult ExpireSession()
    {
        string sessionId = Session.SessionID;
        Session.Abandon();
        return new ContentResult()
        {
            Content = "Session '" + sessionId + "' abandoned at " + DateTime.Now
        };
    }
    

母版页中检测过期会话和重定向的代码应如下所示:

if (Session != null
    && Session.IsNewSession
    && Request.Cookies["ASP.NET_SessionId"] != null
    && Request.Cookies["ASP.NET_SessionId"].Value != "")
{
    Session.Clear();
    Response.Redirect(timeoutPageUrl);
}
在重定向之前调用session.Clear()可确保在后续页面上session.IsNewSession将为false

还要注意,我正在检查ASP.NET_SessionId cookie的值中是否有空字符串。这有助于防止注销被误认为是过期会话,如果您在注销过程中碰巧调用了session.about()。在这种情况下,请确保在注销过程中使旧会话cookie过期:

Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.MinValue;

我不知道你为什么会有问题,为什么在请求主页时IsNewSession应该是真的。到那时,您已经收到了对某个页面的请求,然后是对“会话已过期”的请求,然后是对主页的请求。为什么IsNewSession仍然是真的?Session.Clear()是关键!