關於java web 開發中session過期的理解

最近做一個項目要求實現一個功能。

就是如果用戶A已經登錄到系統中。如果其他人再使用用戶A的帳號在其他機器或者瀏覽器上登錄,都會登錄失敗。只能等待用戶A在系統中註銷或者Session超時纔可以登錄。

這個項目是用java web相關技術實現的。 其實實現的原理比較簡單就是將用戶登錄後將session保存到一段共享的內存中(程序中是用靜態的HashTable保存所有的Session)。

其中當用戶的session過期失效後。我發現map中的session對象依然存在。不過從HashTable得到這個過期後的session對象調用getAttribute()方法時。會拋出一個session已經失效的異常。而在session失效後用request.getSession()取得的Session對象並不是保存在HashTable中的session對象。兩者有着不同的sessionID 和 session對象地址。 前者可以使用getAttribute()這樣的方法,不過由於是新的對象所以沒有屬性值。

這樣的結果可以推出服務器對session過期管理的結論: session的過期失效,實際上服務器會重新創建一個session對象將對原來session對象的引用指向新的session並將sessionID發送給客戶端保存以替換原來的sessionID。 而舊的session對象由於客戶端的sessionID已經修改將不會被獲得。舊的session對象等待jvm垃圾回收進程進行垃圾回收。

* 注: 不過這個項目中由於session過期後session的引用保存在靜態的HashTable中使得就得session對象不會被垃圾回收器回收。 HashTable會隨着系統的運行變得越來越大。注意到這個問題後。使用了session監聽器當session失效後捕獲其session對象並從HashTable中移出。從而達到理想的效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章