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

时间:2018-10-01 02:40:09

标签: java-ee spring-security timeout jsessionid

我有一个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

1 个答案:

答案 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