2011-04-29 121 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)。服务器将此标识符映射到当前存储在用户会话中的任何数据。

数据本身可能会存储在内存中,或者可能会被序列化为数据库或文件,具体取决于您正在使用的服务器及其配置。