即使<session-timeout>为-1,会话也将到期

时间:2017-04-20 12:14:42

标签: java session servlets

在我正在研究的Web应用程序(Servlet-JSP MVC)中,我将会话超时设置为-1,这意味着会话永远不会过期,直到在注销期间故意无效。

<session-config>
    <session-timeout>-1</session-timeout>
</session-config>

但是如果用户保持空闲状态(即应用程序没有活动),然后在一段时间后刷新应用程序,则会话过期。

我正在将Apache Tomcat 7.0与XAMPP一起用于我的应用程序。

可能是什么原因?可以做些什么来使会话无限期地保持活力?什么&#34; -1&#34;在session-timeout标签中实际意味着什么?

1 个答案:

答案 0 :(得分:0)

更好的方法是使用ajax调用来刷新会话,但不要将会话超时设置得太长,因为用户可以在不退出的情况下关闭浏览器,然后会话实体将保留在内存中但永远不会被使用再次。

您设置不起作用可能是由于这三个地方的设置冲突造成的:

(1)Java代码 session.setMaxInactiveInterval(600);

(2)webapp&#39; s web.xml

(3)Contianer(tomcat?)设置conf/web.xmlCatalina/localhost/yourapp/context.xmlserver.xml或您应用的子模块中的事件。

<Context path="/" docBase="/yourapp/base"      
  defaultSessionTimeOut="3600"  ... />  

优先级(1)&gt;(2)&gt;(3)

---- ---- EDIT

根据tomcat 7文档,如果您使用SSL(https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

  

sessionTimeout

     

创建SSL会话后的时间(以秒为单位),它将超时。使用0指定无限制超时。如果未指定,则使用&gt;默认值86400(24小时)。

使用0指定无限超时

此链接JSESSIONID Cookie with Expiration Date in Tomcat和此https://stackoverflow.com/a/13463566/1484621值得一看

测试session的正确方法是request.getSession(false) == nullrequest.getSession(true).isNew()

根据源代码

/**
 * Set the default session timeout (in minutes) for this
 * web application.
 *
 * @param timeout The new default session timeout
 */
@Override
public void setSessionTimeout(int timeout) {

    int oldSessionTimeout = this.sessionTimeout;
    /*
     * SRV.13.4 ("Deployment Descriptor"):
     * If the timeout is 0 or less, the container ensures the default
     * behaviour of sessions is never to time out.
     */
    this.sessionTimeout = (timeout == 0) ? -1 : timeout;
    support.firePropertyChange("sessionTimeout",
                               oldSessionTimeout,
                               this.sessionTimeout);

}

设置为0或-1的session-timeout将具有相同的结果