2011-04-29 80 views
18

對象被序列化併發送給用戶並返回到每個連接(存儲在cookie中)?Java HttpSession屬性存儲在哪裏?

或者它們存儲在服務器堆中,cookie只是一個非常小的標識符?

有關此主題的任何信息都會有所幫助。

謝謝

+0

相關:http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909 – BalusC 2011-04-30 04:08:18

回答

20

你明白了第二個猜想。

該cookie包含一個JSESSIONID。該id用於在服務器維護的地圖中查找用戶的HttpSession。至少這是最常見的方式。服務器可以採用更復雜的方式來實現這一點,但將整個狀態穿梭於cookie中並不是其中之一。

這有一些暗示。首先,如果服務器出現故障,您將失去會話狀態。其次,如果你有一個服務器集羣,你需要讓用戶每次連接到同一個服務器,否則他們將在後續請求之間失去會話。最後,如果有人發現複製其他人的JSESSIONID並用它替換他們的方法,會話劫持成爲可能。

+0

是否有任何安全的替代品? – 2011-04-29 23:06:13

+9

您的最後一段不完全準確。流行的Java Web服務器(至少Tomcat和JBoss)可以配置爲將會話狀態保存到磁盤,以便在崩潰或服務器重啓時保留會話狀態。同一臺服務器還支持在集羣中的所有節點之間共享會話狀態,以便用戶可以在不丟失其會話的情況下擊中集羣中的任何節點(並且如果集羣節點關閉,用戶可以繼續與不同節點的會話好像什麼也沒有發生)。 – aroth 2011-04-29 23:20:36

+3

@aroth - 你是對的。我的第二段提到了會話在Tomcat中處理的最常見方式,特別是它出來的方式(可以這麼說)。我提到了更復雜的系統,但並不認爲這個問題需要深入探討持續/共享會話的所有複雜性。如果你看看原來的問題,它所要求的只是闡明瞭cookies如何用於會話狀態。我故意排除所有不同的可能性。 – rfeak 2011-04-30 23:01:47

5

該cookie只包含會話標識符(通常稱爲JSESSIONID)。服務器將此標識符映射到當前存儲在用戶會話中的任何數據。

數據本身可能會存儲在內存中,或者可能會被序列化爲數據庫或文件,具體取決於您正在使用的服務器及其配置。