2010-10-26 74 views
1

我需要整天保持會話嗎?在會話到期之前或之前,如何在一天中執行會話而不會在IIS或web.config中給出任何會話超時?全天保持會話

注意:IIS中的默認會話超時 - 20分鐘。

由於提前

+0

難道你不能只將會話超時設置爲24小時嗎? – CyberDude 2010-10-26 12:25:07

+0

爲什麼你不能在web.config中設置它? – 2010-10-26 12:27:25

+0

@Cyber​​Dude:這意味着會話在* last *請求後的24小時內在服務器上保持活動狀態,並佔用整個時間的資源。 – 2010-10-26 12:30:04

回答

1

您可以做的第一件事是通過使用SQL(或其他數據庫)會話狀態服務器將會話與流程分離,該會話狀態服務器包含附加到會話標識的會話數據的序列化副本。然後,您可以使用持久cookie來回傳遞會話ID。任何到期的會話都可以重新生成或恢復。

既然你想整天保持一個會話(這天生就是不安全的),我們會假設大多數安全考慮已經被拋出。如果您擔心重播攻擊,您可以使用HMAC通過設置會話ID,日期時間,用戶名(如果這是您的數據的一部分)來驗證Cookie會話請求,也可以使用字符串中的IP地址,然後單向醃製這個數據的散列。通過這種方式,您可以重新哈希數據,並將與請求一起發送的哈希與來自該數據的生成的哈希進行比較,以查看請求是否有效。

+0

對於使用SQL而不是inProc來說,這將緩解大量會話同時打開的問題(在這種情況下聽起來很可能) – 2010-10-26 12:57:02

1

強制頁面被由JavaScript每隔10分鐘左右刷新一次。會話超時後最後請求頁面多長時間,會話變得無效。每隔10分鐘刷新頁面時,會話在每次刷新時都會延長20分鐘。

+0

或者使用類似於Ajax的方法刷新頁面的一部分*然後用戶不會注意到回發。 – 2010-10-26 12:28:30

+0

這不會使瀏覽器關閉和維護會話。如果這不是要求,那麼這很有用,但如果用戶導航20分鐘並返回,則會中斷。 – 2010-10-26 12:28:39

+0

這不會保持會話24小時開放 - 它會無限期地執行(不是這裏的要求) – 2010-10-26 13:02:08

0

如果您拒絕將web.config中的設置更改爲更長的值,則可以嘗試強制瀏覽器在會話超時的短時間內(例如17分鐘)刷新。可能還有其他漂亮的方法。

如果你可以找到一個方法來做到沒有這個會話,它會在以後節省你的痛苦。使用緩存策略(memcached)或查看資源使用情況。

例如你真的需要將X序列化到會話中嗎?

0

使用StateServer而非是InProc

這代表所有的會話處理到一個單獨的數據庫,並從服務器的過程中刪除。這樣可以緩解服務器資源耗盡的問題,從而可以將會話超時增加到24小時。

我相信這是唯一可行的解​​決方案。

0

Peiter處於正確的軌道上 - 製造虛假的請求以保持活力。你絕對不想刷新頁面,導致不需要的更新等。你甚至不需要刷新頁面的一部分。您只需每隔X分鐘發送一次ajax請求,而用戶將瀏覽器打開到啓用會話狀態的IHttpHandler。這非常非常有效 - 我們有一個應用程序完全依賴會話來處理5分鐘會話超時的任何事情。並且每4.5分鐘發一次會話心跳。它已經投產3年多了,我們還沒有失去一個會議。是的,在這種情況下會話狀態被存儲在進程中 - 會話的使用非常繁重,我們不希望等待他們出去使用SQL並返回。

PS:protip - 確保請求和響應唯一;否則在某些瀏覽器中緩存會導致此技巧無效。

0

把一個ajax調用放入一個定時器,一個不執行任何操作的方法「」,這就是即使用戶在頁面上但沒有做任何事情意味着「完全不活動」,不會註銷,我們已經實現了相同邏輯並解決了我們的問題,我們的目標是3到4個小時,並且我們不希望更改web.config中的值或因某些原因使用任何其他方式。

ajax調用將在「計時器」中,將計時器時間設置爲「任何」。