Java SessionTimeout:web.xml vs session.maxInactiveInterval()

Java SessionTimeout:web.xml vs session.maxInactiveInterval(),java,session,servlets,weblogic,session-timeout,Java,Session,Servlets,Weblogic,Session Timeout,我正在尝试在Java中超时HttpSession。我的容器是WebLogic 目前,我们在web.xml文件中设置了会话超时,如下所示 我不想在15分钟内删除所有会话,只想删除那些已停用15分钟的会话 这些方法等效吗?我应该选择web.xml配置吗 现在,我被告知这将在使用的第15分钟内终止会话(或者是所有会话?),无论他们的活动如何 这是错误的。当相关客户端(webbrowser)超过15分钟未访问该网站时,它将终止会话。正如您最初期望的那样,看到您试图解决此问题,该活动当然很重要 顺便说一

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

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

我不想在15分钟内删除所有会话,只想删除那些已停用15分钟的会话

这些方法等效吗?我应该选择web.xml配置吗

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

这是错误的。当相关客户端(webbrowser)超过15分钟未访问该网站时,它将终止会话。正如您最初期望的那样,看到您试图解决此问题,该活动当然很重要

顺便说一句,这里的天气变化不大。它的功能与
web.xml
中的
完全相同,唯一的区别是您可以在运行时以编程方式更改/设置它。顺便说一下,更改只影响当前会话实例,而不是全局(否则它将是一个
静态方法)


要自己玩并体验这一点,请尝试将
设置为1分钟,然后创建一个类似的:

@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
中注册):


com.example.HttpSessionChecker
请注意,servletcontainer不会在超过超时值后立即销毁会话。它是一个后台作业,以一定的间隔运行(例如,根据负载和servletcontainer的品牌/类型,5~15分钟)。因此,当您在一分钟的不活动之后没有立即在控制台中看到
被破坏的
行时,不要感到惊讶。但是,当您对超时但尚未销毁的会话发出HTTP请求时,它将立即被销毁

另见:
现在,我被告知这将在使用的第15分钟内终止会话(或者是所有会话?),无论他们的活动如何

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

这些方法等效吗?我应该选择web.xml配置吗


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

此外,我想澄清一下。此配置适用于所有会话。另一件需要注意的事情是,在web.xml中将该值设置为0或更小,这意味着会话将永远不会超时(只要servlet容器仍然处于活动状态)。但是,通过编程将其设置为0会导致会话立即超时(将其设置为负数意味着会话永远不会超时,与web.xml中的情况相同)。此外,请注意,maxInactiveInterval默认为60秒@BalusC,“当您对一个超时但尚未销毁的会话发出HTTP请求时,它将立即被销毁”,您是否知道会话是否已销毁1.在执行任何控制器代码之前还是2.与控制器逻辑同时/异步?我猜是1.但不确定。
session.setMaxInactiveInterval(15 * 60); //15 minutes
@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());
    }

}