【问题标题】:How to call sessionDestroyed when a session times out会话超时时如何调用 sessionDestroyed
【发布时间】:2010-12-29 01:41:16
【问题描述】:

我是 JSP 的新手。我在一个实现HttpSessionListener 的类中使用了以下代码,以在会话超时时获取 SESSION OUT:

    public void sessionCreated(HttpSessionEvent arg0) {  
        System.out.print("SESSION Created");
    }

    public void sessionDestroyed(HttpSessionEvent arg0) {
        System.out.print("SESSION OUT");
    }

我设置在web.xml:

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

servlet 等待超过两分钟,然后它调用sessionDestroyed

有没有办法在超时时强制sessionDestroyed

提前致谢。

【问题讨论】:

    标签: java servlets session-timeout


    【解决方案1】:

    是什么让您认为sessionDestroyed 在会话超时时没有被调用?或者换句话说,你对它被调用的事实有何解释?

    servlet 将以自己的方式处理会话的有效性,包括会话超时,当它确定会话不再有效时,它将调用您的方法。但是,我认为任何 servlet 都不能保证这方面的任何特定及时性。我的理解是,这有点像垃圾回收,因为它保证会在某个时间点发生,但不一定在会话有资格被销毁的最早可能的情况下发生。

    在任何情况下,似乎几乎可以肯定 servlet 正在执行您想要的操作 - 看到会话超时并调用适当的方法 - 唯一的问题是您是否会在 60 秒后看到这个最后一个请求或稍后。我建议您通常不应该依赖调用此方法的确切时间;当然,用它来清理资源,但不是为了程序正确性(如果在无效会话上调用方法,你会得到IllegalStateExceptions)。如果你觉得你真的必须依赖这一点,或许可以解释一下你在做什么,以便其他人可以提出更合适的方法来实现这一点。

    【讨论】:

      【解决方案2】:

      servlet 等待超过两分钟,然后它调用 sessionDestroyed。

      有没有办法在超时时强制 sessionDestroyed ?

      这是特定于实现的(取决于应用程序服务器)。有一个后台线程以定时间隔检查会话并获取所有过期的会话。这可能每分钟发生一次,但也可以每 15 分钟发生一次。如果您在关联的会话已经超时但尚未收获时发出请求,它们也将立即被收获。

      因此,例如,如果您等待一分钟并触发一个新请求,那么它将立即获得。真的没有必要担心这一点。你不需要强迫它立即收获它们,那将是一项昂贵的任务。你知道,这只是关于编程,而不是魔法;)

      【讨论】:

      • 我不知道这个接口的其他设计目的是什么,除了释放特定会话被销毁时占用的资源。我想说的是,为了这个设计目的,没有必要在某个确切的时间点(例如time out)实现它。这只是我的观点。我不知道这是否正确。谢谢。
      【解决方案3】:

      当您通过 invalidate() 方法强制用户注销时,HttpSessionListener sessionDestroyed() 方法会被调用两次,一次是在他们注销时,另一次是在一段时间后。如果在注销后将用户重定向回应用程序中的网页,则会发生这种情况。您实际上在做的是开始另一个会话(如果您没有向所有网页添加安全/身份验证要求,这可能不会立即明显),并且 sessionDestroyed() 方法的延迟第二次调用是发生超时。简单的解决方案,在注销时将用户重定向到应用程序之外的网页。阅读这篇文章session

      【讨论】:

        【解决方案4】:

        我不认为 J2EE 规范对何时调用侦听器上的方法做出任何保证。它只是声明它们将在某个时候被调用。

        我见过在一个容器 (Tomcat) 上工作但在另一个容器 (OC4J) 上不工作的代码。开发人员对何时调用 sessionDestroyed 方法做出了无效的假设。

        更新

        请注意,该接口的行为在 servlet 规范的 v2.4 中发生了变化。详情请见page 21

        【讨论】:

          猜你喜欢
          • 2011-09-21
          • 1970-01-01
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-20
          • 2010-11-26
          • 2014-07-16
          相关资源
          最近更新 更多