2009-09-09 116 views
3

我目前正在研究ASP.Net 3.5項目並試圖實現會話超時檢測。我知道如何使用啓用會話cookie來做到這一點,但沒有我完全失去了。如何使用無Cookie會話檢測會話超時

當會話超時發生時,我想將用戶重定向到某個自定義頁面。

有人可以解釋我該怎麼做嗎?

我的基於cookie的解決方案是這樣的,我wan't重現其行爲:

if (Session.IsNewSession && (Request.Cookies["ASP.NET_SessionId"] != null)) 
    Response.Redirect("..."); 

回答

2

它看起來像我找到了解決方案。我對此並不滿意,但目前它的工作。

我添加了一個隱藏字段到我的網頁標記

<asp:HiddenField ID="sessionID" runat="server" /> 

和下面的代碼我隱藏

public void Page_Load(object sender, EventArgs eventArgs) 
{ 
    if (Context.Session != null) { 
     if (Context.Session.IsNewSession) { 
      if (!string.IsNullOrEmpty(sessionID.Value)) { 
       Response.Redirect("~/Timeout.aspx") 
      } 
     } 
     sessionID.Value = Context.Session.SessionID; 
    } 
} 

您還需要添加到您的網站。config或ASP忽略所有發佈的表單字段

<sessionState cookieless="true" regenerateExpiredSessionId="false"/> 

regenerateExpiredSessionId是重要的屬性。

2

Session_End中在Global.asax應始終被解僱,儘管使用會話類型。

-edit:您可能也有興趣在

Session.IsNewSession 

,因爲這讓你在新的請求是否前一交易日可能已經超時的信息。

+0

我知道,但Session_End不允許將重定向推送到客戶端。但是,謝謝。我會將這個要求添加到我的問題中。 – Cubicle 2009-09-09 14:13:07

+2

僅當您使用InProc會話時纔會觸發Session_End - 僅僅因爲它們不含Cookie,並不排除使用Sql或State Server模式。 – 2009-09-09 14:20:50

+0

我試過Session.IsNewSession,但是這種方式我很難區分全新的會話和超時的會話。 – Cubicle 2009-09-09 14:29:05

0

它的工作方式非常相似 - 會話服務每次在URL中接收到具有該會話標識的請求時都會更新一個時間戳。噹噹前時間超過時間戳時,會話過期。

如果您在會話中添加了某些內容,並檢查每個請求中是否存在該內容,如果不存在,則知道該會話是新鮮的(替換已過期的用戶或新用戶)。

+0

我試圖使用IsNewSession。它應該與您建議的解決方案相同。我的問題是我無法通過這種方式區分新會話和超時會話。 – Cubicle 2009-09-09 14:19:59

-1

如果你不喜歡Session_End,你可以嘗試一個非常快速和骯髒的解決方案。在global.asax中設置一個Session["Foo"]Session_Start,然後在您的頁面中檢查Session["Foo"]。如果爲空,則會話已過期。

這是在Nikhil's Blog中提出的解決方案之一。覈實。

+0

當您檢查會話中是否存在Foo時,會話將已重新初始化,因此無法工作。 – 2009-09-09 14:35:51

0

我看看AnthonyWJones'答案「數據庫」部分,以一個類似的問題在這裏:

ASP.Net Session Timeout detection: Is Session.IsNewSession and SessionCookie detection the best way to do this?

在會話開始時,你應該能夠檢查數據庫中是否存在SessionID - 我假設如果我在URL中請求帶有SessionID的頁面,那麼這就是我將使用的SessionID - 我沒有測試過。

您應該確保在用戶手動註銷時清除此數據庫,以確保您存儲標誌的新實例。