2013-04-29 55 views
1

當主管和其他人使用的工作場所繫統關閉標籤時,我一直試圖從會話中獲得一個乾淨的休息時間。當這個人註銷時,我是成功的 - 全部被清除。但是,關閉選項卡時,可以隨意重新打開,就像從未調用session.clear()一樣。當我看到它運行時,Asp.Net Session.Clear()爲什麼不能在關閉選項卡上工作?

我使用這個JavaScript:

$.ajax({ 
    type: "POST", 
    url: "default.aspx/EndSession", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (msg) { } 
}); 

調用這個Web方法:

[WebMethod] 
public static string EndSession() 
{ 
    HttpContext.Current.Session.Clear(); 
    HttpContext.Current.Session.Abandon(); 
    HttpContext.Current.User = null; 
    FormsAuthentication.SignOut(); 
    return ""; 
} 

我設置一個斷點,看代碼執行爲我一步通過它,它返回。選項卡關閉,然後我右鍵單擊並選擇「重新打開關閉的選項卡」,頁面返回並且會話仍處於活動狀態。

我看到here ppl說這是不可能的,但不明白爲什麼,因爲代碼在服務器上運行 - 我正在看它運行,並且會話沒有被清除。我原以爲這是對「Session.Clear()」和「Session.Abandon()」的顯式調用的要點。註銷Page_Load中的相同代碼很好。

爲什麼?我錯過了什麼?會話清除是否在運行後被拋出,因爲該選項卡已關閉?

謝謝!

+0

請參閱[此答案](http://stackoverflow.com/a/14913314/151212)。海事組織,唯一真正的解決方案是存儲服務器端的東西,而不僅僅依賴於會話cookie。 – explunit 2013-04-29 15:53:26

+0

現在標題這樣。會話可能會在多個選項卡中打開,因此會增加複雜性,但現在我將從您指出的建議開始。感謝您的信息 - 我會在成功時回覆(希望)。 – 2013-04-30 17:33:25

回答

1

嘗試將Session.RemoveAll();redirect添加到另一頁?

public static string EndSession() 
{ 
    HttpContext.Current.Session.Clear(); 
    HttpContext.Current.Session.Abandon(); 
    HttpContext.Current.Session.RemoveAll(); 
    HttpContext.Response.Redirect("~/login.aspx", true); 
    HttpContext.Current.User = null; 
    FormsAuthentication.SignOut(); 
    return ""; 
} 


除了上面的代碼添加上的Page_Load:

HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
HttpContext.Current.Response.Cache.SetNoServerCaching(); 
HttpContext.Current.Response.Cache.SetNoStore(); 

我不是100%肯定它會工作,我認爲它希望寫出來能有一定的幫助。

+0

添加了您建議的行。我之前在那裏有緩存的東西,剛剛嘗試過重定向 - 我已經嘗試過從JavaScript,它被忽略(可能由設計)。代碼隱藏也沒有運氣。所以OP中的評論可能是我最好的選擇。 – 2013-04-30 17:29:13

相關問題