Java EE 如何延长会话生存期/超时



>我有一个Java EE会话,如果空闲,它会在10分钟内超时。我知道任何命中服务器的请求都会使其"不空闲",并且其会话将被刷新。

我的问题是,Java EE容器如何处理这个问题?

1(是因为它检测到HTTP请求标头中cookie(JSESSIONID(的存在吗?

2(还是因为打电话给request.getSession()request.getSession(false)下面的技巧?

搜索了许多帖子后,我找不到任何详细的内容。

为什么我需要知道这一点,是因为我遇到了一个问题。我有一个应用程序,它在 10 分钟内超时。但是我也有一个轮询 ajax 在几秒钟后定期运行。这意味着,我的会话永远不会过期/超时。ajax 轮询包含 cookie (JSESSIONID(,但我不确定这是否是主要原因,因为我确实有 Spring 安全过滤器,它可能为每个 HTTP 请求调用request.getSession

经过一段时间的搜索,我认为没有绝对的答案,因为它取决于个人实现。

基于我在servlet-4-final-spec上找到的规范:

7.6 上次访问时间

HttpSession 接口的 getLastAccessedTime 方法允许 servlet 确定上次 在当前请求之前访问了会话。会话是 当请求是会话的一部分时,被视为被访问 首先由 servlet 容器处理。

所以我去找Tomcat实现:

long getLastAccessedTime((

返回客户端上次发送与此关联的请求的时间 会话,作为自 1970 年 1 月 1 日午夜以来的毫秒数 GMT,并按容器收到请求的时间进行标记。 应用程序执行的操作,例如获取或设置 值与会话相关联,不影响访问时间。

仍然不是很清楚,它说"与会话相关的价值",但没有说getSession

然后我发现这个:

org.apache.catalina.core.StandardHostValve.ACCESS_SESSION

如果为真,则与会话关联的每个请求都将 导致会话的上次访问时间更新,而不管 请求是否显式访问会话。否则,默认值将为false

因此,对于 Tomcat,默认情况下,我们必须显式调用request.getSession才能刷新会话,除非我们将此 Tomcat 属性设置为 true。

参考:

1( 会话被视为已访问时

2( http://tomcat.10.x6.nabble.com/Session-timeouts-ignore-quot-periodic-polling-quot-URL-td2159572.html

最新更新