Jetty具有此功能,可以将空闲的HttpSession对象从内存中驱逐出来并将其保留在磁盘上(钝化)。一旦新请求到达并具有相同的会话ID,它将被带回内存(激活)。
HashSessionManager和HashedSession的Jetty 9.2和9.3源代码揭示了在空闲逐出过程中不会丢弃实际的HttpSession实例,而只是清除它们中的属性。
这告诉我保持对HttpsSession的引用的持续时间比其活动生命周期长。并且我不应该担心在它被去除后重复同一个会话。
我很想知道这是否是所有Web服务器实现的标准行为。我找不到任何证明这一点的文件。 由于会话管理在jetty 9.4中完全重写,所以它也是如此吗?
答案 0 :(得分:0)
您从HttpServletRequest访问的HttpSession只是在Http交换期间有效,一旦您的请求被处理,并且产生响应,并且请求调度完成,您访问的特定HttpSession实例是现在无效,并且已经回收。
在该时间范围之外保持它是非常不明智的,因为对象及其信息可以从对象池中回收到不同用户的不同请求/响应中。
WebSocket是另一种动物。
将HTTP连接升级到WebSocket后,所有HTTP特定信息都无效。
为什么呢?那是因为WebSocket不是HTTP,升级会停止/终止活动的HTTP交换。
Jetty中的实现将在升级时回收HttpServletRequest
,HttpServletResponse
和HttpSession
,以便在以后的HTTP请求中使用。
另外值得注意的是,HttpServletRequest
,HttpServletResponse
和HttpSession
的上下文,生命周期和生命周期未在Servlet规范或CDI规范中定义。这意味着如果您在WebSocket中使用/要求这些对象,请知道您已进入未定义的行为。将这些对象所需的信息复制到WebSocket端点中是明智的。
答案 1 :(得分:0)
Jetty中的实现将在升级时回收HttpServletRequest,HttpServletResponse和HttpSession,以便在以后的HTTP请求中使用。
在jetty 9.4中,UpgradeHttpServletRequest保留在HttpSession ref上,但在完成时将HttpServletRequest ref为空。 我目前正在利用这个功能与多个套接字共享属性。