Java HttpSession属性存储在哪里?

22

在每次连接时(存储在cookie中),对象是否被序列化并发送给用户,然后再返回?

还是它们存储在服务器堆中,而cookie只是一个非常小的标识符?

关于这个话题的任何信息都将有所帮助。

谢谢


相关链接:https://dev59.com/GnA75IYBdhLWcg3wy8Qi#3106909 - BalusC
2个回答

23

你第二次猜对了。

这个cookie包含一个JSESSIONID。该ID用于在服务器维护的映射中查找用户的HttpSession。至少这是最常见的方法。服务器可以实现更为复杂的方式,但在cookie中来回传输整个状态不是其中之一。

这有一些影响。首先,如果服务器宕机,您将失去会话状态。其次,如果您有一个服务器集群,您需要让用户每次连接到同一台服务器,否则他们将在后续请求之间失去会话。最后,如果有人找到一种方法复制某人的JSESSIONID并将其替换为自己的,则会话劫持成为可能。


有没有任何安全的替代方案? - Horatiu Jeflea
10
你最后一段话并不完全准确。流行的Java Web服务器(至少Tomcat和JBoss)可以被配置为将会话状态持久化到磁盘上,以便在崩溃或服务器重启时保留状态。同样的服务器还支持在集群中所有节点之间共享会话状态,这样用户可以访问集群中的任何节点而不会失去他们的会话(如果集群节点宕机,用户可以继续使用另一个节点来进行会话,就好像什么都没有发生一样)。 - aroth
3
@aroth - 你是正确的。我的第二段话涉及到Tomcat处理会话的最常见方式存在的问题,尤其是如何默认处理。我提到了更复杂的系统,但我认为这个问题并不需要深入探讨持久化/共享会话的所有细节。如果你看原始问题,它只是在询问关于cookie如何处理会话状态的澄清问题。我有意留下了所有不同可能性的内容。 - rfeak

8

Cookie仅包含会话标识符(通常称为JSESSIONID)。服务器将此标识符映射到当前存储在用户会话中的任何数据。

数据本身可能存储在内存中,也可能根据您使用的服务器及其配置序列化到数据库或文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接