2009-02-03 109 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