【问题标题】:Where are the Java HttpSession attributes stored?Java HttpSession 属性存储在哪里?
【发布时间】:2011-08-15 20:12:01
【问题描述】:

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

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

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

谢谢

【问题讨论】:

标签: java tomcat servlets cookies httpsession


【解决方案1】:

第二次猜对了。

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

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

【讨论】:

  • 有什么安全的替代品吗?
  • 您的最后一段并不完全准确。流行的 Java Web 服务器(至少是 Tomcat 和 JBoss)可以配置为将会话状态持久保存到磁盘,以便在崩溃或服务器重新启动时保留它。相同的服务器还支持在集群中的所有节点之间共享会话状态,以便用户可以在不丢失会话的情况下访问集群中的任何节点(并且如果集群节点出现故障,用户可以继续与不同节点的会话好像什么都没发生一样)。
  • @aroth - 你是对的。我的第二段提到了在 Tomcat 中处理会话的最常见方式的问题,尤其是当它开箱即用时(可以这么说)。我提到了可用的更复杂的系统,但并不认为这个问题需要深入研究持久/共享会话的所有复杂性。如果您查看原始问题,它所要求的只是说明 cookie 如何用于会话状态。我故意忽略了所有不同的可能性。
【解决方案2】:

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

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

【讨论】: