【问题标题】:Session is expiring even when <session-timeout> is -1即使 <session-timeout> 为 -1,会话也会过期
【发布时间】:2017-09-17 01:41:51
【问题描述】:

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

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

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

我正在为我的应用程序使用带有 XAMPP 的 Apache Tomcat 7.0。

可能是什么原因?可以做些什么来使会话无限期地保持活动状态? session-timeout 标签中的“-1”究竟是什么意思?

【问题讨论】:

    标签: java session servlets


    【解决方案1】:

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

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

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

    (2) webapp 的web.xml

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

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

    优先级(1)>(2)>(3)

    ————编辑————

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

    会话超时

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

    使用 0 指定无限超时

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

    测试session的正确方法是request.getSession(false) == null,或者request.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);
    
    }
    

    session-timeout 设置为 0 或 -1 将得到相同的结果

    【讨论】:

    • 我正在使用第二种方法,即在 webapp 的 web.xml 中设置会话超时,据我所知它将覆盖容器会话超时值。关于 AJAX 调用方法,您能否提供更多有关它的见解?我应该在哪个 jsp 中调用 AJAX。我没有明确的想法。
    • 那你要检查你的代码在哪里使session失效,是不是逻辑有问题?
    • 我使会话​​无效的唯一位置是在 LogOut 控制器中,当用户点击注销按钮时,会话将无效,除了我没有在其他任何地方使会话无效。提供一些关于 AJAX 刷新的输入。
    • 你能在这里提供mcve吗?你用的是什么版本的容器和java?
    • 我们在 XAMPP 上使用带有 java SE 8 的 Tomcat 7.0,根据 tomcat 文档的默认超时时间是 30 分钟,除非我们在 web.xml 中覆盖
    猜你喜欢
    • 2014-05-27
    • 2019-10-27
    • 2015-03-30
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多