【问题标题】:SessionTimeout: web.xml vs session.maxInactiveInterval()会话超时:web.xml 与 session.maxInactiveInterval()
【发布时间】:2011-03-08 07:59:05
【问题描述】:

我正在尝试使 Java 中的 HttpSession 超时。我的容器是 WebLogic。

目前,我们在 web.xml 文件中设置了会话超时,如下所示

<session-config>
    <session-timeout>15</session-timeout>
</session-config>

现在,有人告诉我,这将在使用的第 15 分钟终止会话(或者是所有会话?),无论他们的活动如何。

我想知道这种方法是否正确,或者我应该以编程方式设置不活动的时间限制

session.setMaxInactiveInterval(15 * 60); //15 minutes

我不想在 15 分钟后删除所有会话,只删除那些已闲置 15 分钟的会话。

这些方法是否等效?我应该支持 web.xml 配置吗?

【问题讨论】:

    标签: java session servlets weblogic session-timeout


    【解决方案1】:

    现在,有人告诉我,这将在使用的第 15 分钟终止会话(或者是所有会话?),无论他们的活动

    这是错误。当关联的客户端(网络浏览器)超过 15 分钟未访问该网站时,它将终止会话。正如您最初预期的那样,该活动当然很重要,因为您尝试解决此问题。

    顺便说一句,HttpSession#setMaxInactiveInterval() 在这里没有太大变化。它与web.xml 中的&lt;session-timeout&gt; 完全相同,唯一的区别是您可以在运行时以编程方式更改/设置它。顺便说一下,更改只会影响当前会话实例,而不是全局影响(否则它会是 static 方法)。


    要亲自体验一下,请尝试将&lt;session-timeout&gt; 设置为 1 分钟并创建一个HttpSessionListener,如下所示:

    @WebListener
    public class HttpSessionChecker implements HttpSessionListener {
    
        public void sessionCreated(HttpSessionEvent event) {
            System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
        }
    
        public void sessionDestroyed(HttpSessionEvent event) {
            System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
        }
    
    }
    

    (如果您还没有使用 Servlet 3.0 并因此无法使用 @WebListener,请在 web.xml 中注册,如下所示)

    <listener>
        <listener-class>com.example.HttpSessionChecker</listener-class>
    </listener>
    

    请注意,servletcontainer 不会在恰好超时值之后立即销毁会话。这是一个以特定时间间隔运行的后台作业(例如 5~15 分钟,具体取决于负载和 servletcontainer 的制作/类型)。因此,当您在完全不活动一分钟后没有立即在控制台中看到 destroyed 行时,请不要感到惊讶。但是,当您在超时但尚未销毁的会话上触发 HTTP 请求时,它将立即被销毁。

    另见:

    【讨论】:

    • 此外,澄清一下。此配置适用于所有会话。
    • 还有一点需要注意 - 在 web.xml 中将值设置为 0 或更少意味着会话永远不会超时(只要 servlet 容器仍然存在)。但是,以编程方式将其设置为 0 会导致会话立即超时(将其设置为负数意味着会话永远不会超时,与 web.xml 中相同)。
    • 另外,请注意 maxInactiveInterval 默认为 60 秒 tomcat.apache.org/tomcat-6.0-doc/config/manager.html
    • @BalusC ,“当您在超时但尚未销毁的会话上触发 HTTP 请求时,它将立即被销毁”,您知道会话是否被销毁 1.在执行任何控制器代码之前或 2. 与控制器逻辑同时/异步?我猜 1. 但不确定。
    【解决方案2】:

    现在,有人告诉我,这将在使用的第 15 分钟终止会话(或者是所有会话?),无论他们的活动如何。

    不,那不是真的。 session-timeout 在不活动的情况下配置每个会话超时。

    这些方法是否等效?我应该支持 web.xml 配置吗?

    web.xml 中的设置是全局的,它适用于给定上下文的所有会话。以编程方式,您可以为特定会话更改此设置。

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2013-03-01
      • 2017-10-23
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2018-01-23
      相关资源
      最近更新 更多