保持对 HttpSession 的引用 passivates/activates

Keep reference to HttpSession while it passivates/activates

Jetty 具有此功能,它可以将空闲的 HttpSession 对象逐出内存并将它们保存在磁盘上(钝化)。一旦具有相同会话 ID 的新请求到达,它将被带回内存(激活)。

HashSessionManager 和 HashedSession 的 Jetty 9.2 和 9.3 源代码揭示了实际的 HttpSession 实例在空闲驱逐过程中并没有被丢弃,只是其中的属性被清除。

这告诉我,保留对 HttpsSession 的引用的时间长于其有效生命周期是安全的。而且我不应该担心在同一个会话被取消空闲后有一个副本。

我很想知道这是否是所有 Web 服务器实现的标准行为。我找不到任何文件证实这一点。 由于会话管理在 jetty 9.4 中被完全重写,所以那里也是如此吗?

您从 HttpServletRequest 访问的 HttpSession 只保证在 Http 交换期间有效,一旦您的请求被处理,并产生响应,并且请求分派完成,您的特定 HttpSession 实例accessed现在无效,回收。

在超过该时间范围内保留它是非常不明智的,因为对象及其信息可能会(从对象池)回收到不同的 request/response 供不同的用户使用。

WebSocket 是另一种动物。

一旦 HTTP 连接升级为 WebSocket,所有 HTTP 特定信息都将失效。

为什么?那是因为 WebSocket 不是 HTTP,而升级 stops/terminates 是活动的 HTTP 交换。

Jetty 中的实现将在升级时回收 HttpServletRequestHttpServletResponseHttpSession,以便在以后的 HTTP 请求中使用。

另外请注意,HttpServletRequestHttpServletResponseHttpSession 的上下文、生命周期和生命周期未在 Servlet 规范或 CDI 规范中定义。这意味着如果你 use/require WebSocket 中的那些对象,就知道你已经进入了未定义的行为。明智的做法是从这些对象中复制您需要的信息以供您的 WebSocket 端点使用。

The implementation in Jetty will recycle the HttpServletRequest, HttpServletResponse, and HttpSession at the point of the upgrade for use on a later HTTP request.

在 jetty 9.4 中,UpgradeHttpServletRequest 保留 HttpSession ref,但在完成时将 HttpServletRequest ref 清空。 我目前正在利用它与多个套接字共享属性。