2009-02-03 70 views
9

我需要一种方式告诉ASP.NET“在当前会话中重新定向并在重定向到页面之前/之后重新开始一个全新的会话”。让会话在ASP.NET中优雅过期

这里就是我想要做的事:

1)当会话在ASP.NET应用程序的主网页(或Global.asax中)已过期检测。

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

3)用户到达主页面并重新开始使用该应用程序。

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

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

以前有人曾经遇到过这个问题,所以我对社区有信心有一个很好的解决方案。提前致谢。

+0

我不知道为什么你有一个问题,为什么要高度重视请求主页时IsNewSession是真实的。到那时你已经有一个请求到某个页面,然后请求“Session expired”,然后到主页面。为什么IsNewSession仍然是真的? – AnthonyWJones 2009-02-03 22:32:10

回答

11

你正在描述的问题是因为asp.net重复使用sessionid,如果sessionid仍然存在于auth cookie中,当你调用abandon()时它会重用它,你需要显式地创建一个新的sessionid afaik something像:

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

感谢您的及时回应,这对我有效。 – 2009-02-03 22:54:48

-1

你是否在你的特殊“你的会话过期”页面中调用Session.Abandon?如果是这样,不要。

+2

呃..解释? – 2010-12-14 02:05:04

0

的加入饼干招工作对我来说也是,如下:

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 
2

对于ASP.NET MVC这是我与一个动作方法做。

注:

  • 返回,没有其他资源的简单视图,以便您可以验证行动succcessfully

    完成,可能意外重新创建一个会话
  • 我返回当前时间和会话ID

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

您的母版页中检测到过期会话和重定向的代码应该看起来像这样的:

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会是假的。

另请注意,我正在检查ASP.NET_SessionId cookie值的空字符串。如果您在注销过程中恰好调用Session.Abandon(),这有助于防止注销被误认为过期会话。在这种情况下,一定要到期的旧会话cookie作为注销过程的一部分:

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

Session.Clear()是重点! – Caesar 2014-08-10 14:46:39