Java HttpSession属性存储在哪里?

Hor*_*lea 20 java cookies tomcat servlets httpsession

对象是否已序列化并发送给用户并返回每个连接(存储在cookie中)?

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

有关此主题的任何信息都会有所帮助.

谢谢

rfe*_*eak 20

你得到了第二个猜测.

该cookie包含一个JSESSIONID.该id用于在服务器维护的地图中查找用户的HttpSession.至少这是最常见的方式.服务器可以通过更复杂的方式实现这一点,但是将cookie中的整个状态切换回来并不是其中之一.

这有一些影响.首先,如果服务器出现故障,您将失去会话状态.其次,如果您有服务器群集,则需要每次都将用户连接到同一服务器,否则他们将在后续请求之间丢失会话.最后,如果有人找到了复制别人的JSESSIONID并用它替换他们的方法,会话劫持成为可能.

  • 你的最后一段并不完全准确.可以将流行的Java Web服务器(至少是Tomcat和JBoss)配置为将会话状态持久保存到磁盘,以便在崩溃或服务器重新启动时保留它.相同的服务器还支持在群集中的所有节点之间共享会话状态,以便用户可以在不丢失其会话的情况下命中群集中的任何节点(并且如果群集节点发生故障,用户可以继续与其他节点进行会话好像什么也没发生过). (10认同)
  • @aroth - 你是对的.我的第二段是指在Tomcat中处理会话的最常见方式的问题,特别是它开箱即用(可以这么说).我提到了更复杂的系统,但并不认为这个问题需要深入研究持久性/共享会话的所有复杂性.如果你看一下原来的问题,它所要求的只是澄清cookie如何用于会话状态.我故意遗漏了所有不同的可能性. (3认同)

aro*_*oth 7

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

数据本身可以存储在内存中,也可以序列化为数据库或文件,具体取决于您使用的服务器及其配置.