2008-09-18 46 views
5

默認情況下會話過期似乎是20分鐘。如何顯式地將asp.net會話設置爲僅在關閉瀏覽器或顯式登錄時過期?

更新:我不希望會話過期,直到瀏覽器關閉。

Update2:這是我的場景。用戶登錄到網站。在場地周圍播放。讓電腦去洗澡(> 20分鐘))。回到電腦,應該能夠玩。他關閉瀏覽器,刪除會話cookie。下一次他從一個新的瀏覽器實例來到該網站時,他需要再次登錄。

在PHP中,我可以在php.ini中設置session.cookie_lifetime爲零來實現此目的。

回答

5

如果要將會話延長超過20分鐘,可以使用IIS管理員更改默認設置,也可以將其設置爲web.config文件。例如,要將網絡中的超時設置爲60分鐘。配置:

<configuration> 
    <system.web> 
    <sessionState timeout="60" /> 
    ... other elements omitted ... 
    </system.web> 
    ... other elements omitted .... 
</configuration> 

你可以做同樣的爲特定的用戶代碼:

Session.Timeout = 60 

您選擇哪種方法,你可以改變超時到任何價值,你認爲是合理的,讓你的用戶做其他事情,仍然保持會話。

當然也有缺點:對於用戶來說,有留下他們的瀏覽器無人值守且仍登錄時,別人開始使用它的可能的安全問題。對你而言,服務器上存在內存使用問題 - 最後一次會話越長,在任何時候都會使用更多的內存。是否重要取決於服務器上的負載。

如果您不想猜測合理的擴展超時,則需要使用已經建議的其他技術之一,這需要瀏覽器中運行的JavaScript定期ping服務器和/或在放棄會話時放棄會話一個頁面被卸載(當然,用戶不會去你網站上的另一個頁面)。

1

這是默認值。當你有一個會話時,它將會話存儲在一個「會話Cookie」中,當瀏覽器關閉時會自動刪除該會話。

如果你想有2個瀏覽器會話之間的會話,您必須將Cookie.Expired設置在功能的日期。

因爲你談論的會話是由服務器存儲的,而不是客戶端,所以你不能做你想做的事情。

但考慮不使用ASP.NET服務器端會話,而只是依靠cookie。

0

有沒有辦法顯式地清除會話,如果你沒有在客戶端,並在窗口關閉的點的服務器之間的某種方式溝通,所以我希望發送一個特別的URI請求在點清除會話接收窗口關閉消息。

我的Javascript不夠好,不能給你實際的指示,抱歉:(

0

你不能,因爲你無法控制怎麼HTML客戶端的響應。

其實你爲什麼需要這樣做呢?只要沒有人可以拿起會議上再次使用,這將在20分鐘之後到期,如果資源很重要,設置一個更積極的會話過期(大多數託管公司這樣做,這是非常惱人的),或者在會話中使用較少的對象嘗試避免任何類型的對象,而只是存儲密鑰檢索它們,這是一個非常重要的設計,因爲它可以幫助您將會議擴展到當你得到大的狀態服務器。

1

不幸的是,由於網絡的明確性質和之間不存在永久鏈路的事實一個網站服務器和一個用戶瀏覽器,當用戶關閉他們的瀏覽器時無法判斷。有些事件和JavaScript可以實現(例如onunload),您可以使用它將呼叫回撥到服務器,從而可以「終止」會話 - Session.Abandon();

您可以設置會話中的會話超時長度web.config,請記住,此超時時間取決於自用戶瀏覽器最後一次調用服務器以來的時間。

未添加瀏覽器超時。

3

您可以設置短會話超時(例如5分鐘),然後定期輪詢服務器,可以使用Javascript每2分鐘觸發一次XmlHttpRequest,或者通過隱藏iframe指向頁面每2分鐘刷新一次。

一旦瀏覽器關閉,會話會很快超時,因爲沒有任何東西可以保持活動狀態。

3

這不是一個新問題,還有如果你想趕上所有會話可以結束方式必須處理的幾個場景,這裏是他們中的一些常見的例子:

  1. 的瀏覽器實例或選項卡關閉。
  2. 用戶使用相同的瀏覽器實例或選項卡導航離開您的網站。
  3. 用戶失去了與互聯網的連接(這可能包括用戶電腦的電力損失或任何其他方式)。
  4. 用戶遠離電腦(或以其他方式停止與您的網站進行交互)。
  5. 服務器斷電/重啓。

前兩項必須由客戶端向服務器發送信息來處理,通常您會使用javascript導航到快速過期會話的註銷頁面。

第三和第四項通常通過設置會話狀態超時(可以是任何時間量)來處理。您使用的時間量基於找到一個值,該值允許用戶使用您的站點而不會壓倒服務器。一個非常粗略的經驗法則可能是30分鐘加上或減去10分鐘。然而,適當的價值可能會成爲另一篇文章的主題。

第五項是根據您如何存儲會話來處理的。存儲在狀態中的會話將無法在重新啓動後存活,因爲它們位於計算機的內存中。存儲在數據庫或cookie中的會話將在重新啓動後存活。你可以在你認爲合適的情況下處理。

在我以前遇到過這個問題的經驗有限時,已經確定只需將會話超時設置爲可接受的值即可。然而它可以完成。

0

糾正我,如果我誤解了你的問題的意圖,但潛在的問題似乎不是如何強制會話結束,當用戶關閉瀏覽器,更多有關如何防止會話結束,直到瀏覽器已關閉。

我認爲真正的答案是重新評估你正在使用的會話。如果您使用它們來維持狀態,我同意其他答案,您可能會不幸運。

但是,首選方法是使用與瀏覽器會話範圍相同的持久狀態機制,例如在瀏覽器關閉時過期的cookie。該cookie可能包含足夠的信息以重新啓動服務器上的會話,如果自上次請求以來已過期。結合相對較短(5-10分鐘)的會話超時時間,我認爲這可以讓您在服務器資源使用率與不讓用戶持續「重新啓動」站點之間取得最佳平衡。

0

哦,你已經重寫了這個問題。

那一個是完全可行的,只要JavaScript是活着。使用任何有時間的Ajax都可以。請與原型庫http://www.prototypejs.org PeriodicalExecutor或使用jQuery的阿賈克斯+計時插件。設置一個虛擬頁面,你的遺囑執行人會不時打電話的時間,所以你會永遠活着,除非他是否註銷(在同一時間殺阿賈克斯定時器)或關閉瀏覽器(這意味着執行程序反正打死)

相關問題