2009-11-04 232 views
2

我有例子,我需要在用戶關閉瀏覽器窗口時關閉會話。 我試過page_unload()不起作用。 這個例子是:我有父窗口,窗口將從它打開我需要刪除會話時,用戶關閉子窗口。 請我需要一些幫助。我想檢測用戶關閉瀏覽器窗口時?

+0

複製 http://stackoverflow.com/參考問題/ 920042/kill-server-side-session-on-browser-window-close-closed http://stackoverflow.com/questions/287022/closing-the-browser-should-actually-clear-the-session- variables-an-asp-net-sessio – 2009-11-04 18:03:11

回答

1

不幸的是,這是不可能的。你可以在網上找到聲稱他們可以這樣做的例子,但它們有時以非常微妙的方式存在缺陷。

0

沒有一致的方式來檢測通過JavaScript關閉瀏覽器。如果您擔心掛起的會話太多,請減少服務器上的會話超時。如果你這樣做,你也會想通知你的用戶他們需要保持活躍狀態​​,以免失去任何工作。

10

這不是在正常的web http協議中提供的。當瀏覽器關閉時,沒有真正的方法可以確切知道;你只能「排序」知道。你必須拼湊一個醜陋的黑客才能獲得任何確定性,即使如此,它必然會在大量邊緣案例中失敗或導致令人討厭的副作用。

正常的解決方法是每隔一段時間從瀏覽器向服務器發送ajax請求以設置一種「心跳」。當心跳停止時,瀏覽器關閉,因此您終止會話。但是,再次:這是一個可怕的黑客。在這種情況下,主要的問題是,如果服務器和客戶端出現不同步或出現javascript錯誤,並且存在會話永遠不會過期的副作用,那麼對於失敗的心跳信號容易出現誤報。

+4

+1:唯一的例外是如果你正在運行某種與服務器不斷通信的內聯Java(或類似的)applet,並且唯一的原因是因爲它在常規的HTML頻道之外運行。 HTML不是一個有狀態的協議,任何嘗試使用JavaScript都是如此的方法是最好的。 – Satanicpuppy 2009-11-04 18:08:26

0

如果您的客戶端腳本發送一個AJAX心跳到你的服務器端應用程序,你可能使用丟失的節拍關閉會話。

0

你有父窗口的所有子窗口 你需要的onfocus檢查子窗口 所以當你的父母得到重點檢查,如果孩子出現與否