我有一个Java EE会话,如果空闲,它将在10分钟内超时。我知道命中服务器的任何请求都会使其“不空闲”,并且其会话将被刷新。
我的问题是,Java EE容器如何在下面处理此问题?
1)是因为它检测到HTTP请求标头中存在cookie(JSESSIONID
)吗?
2)还是,是因为调用了request.getSession()
或request.getSession(false)
,所以下面的技巧是否有用?
搜索很多帖子后我找不到详细的信息。
为什么我需要知道这一点,是因为我遇到了一个问题。我有一个应用程序在10分钟内超时。但是我也有一个轮询ajax在几秒钟后也定期运行。这意味着,我的会话永远不会过期/超时。 Ajax轮询包含cookie(JSESSIONID
),但是我不确定是否是主要原因,因为我确实有Spring Security过滤器,它可能会为每个HTTP请求调用request.getSession
。
答案 0 :(得分:0)
经过一段时间的搜索,我认为没有绝对的答案,因为这取决于具体的实现方式。
基于我在servlet-4-final-spec上找到的规范:
7.6最后访问时间
HttpSession接口的getLastAccessedTime方法允许Servlet确定最后一次 在当前请求之前访问了会话。会话是 当请求是会话的一部分时,被视为已访问 首先由servlet容器处理。
所以我去找Tomcat implementation:
long getLastAccessedTime()
返回客户上次发送与此相关的请求的时间 会话,以自1970年1月1日午夜以来的毫秒数为单位 GMT,并以容器收到请求的时间标记。 您的应用程序执行的操作,例如获取或设置 与会话相关联的值,不会影响访问时间。
仍然不是很清楚,它说“与会话相关的值”,但没有说getSession
。
然后我发现了this:
org.apache.catalina.core.StandardHostValve.ACCESS_SESSION
如果为true,则与会话相关的每个请求都将 导致会话的上次访问时间被更新,无论 请求是否显式访问会话。否则,默认值为 false 。
因此,对于Tomcat,默认情况下,我们必须显式调用request.getSession
才能刷新会话,除非我们将此Tomcat属性设置为true。
参考:
1)When session is considered accessed
2)http://tomcat.10.x6.nabble.com/Session-timeouts-ignore-quot-periodic-polling-quot-URL-td2159572.html