3

我是 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在超时时强制?

提前致谢。

4

4 回答 4

4

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

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

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

于 2009-12-22T10:52:47.513 回答
2

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

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

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

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

于 2009-12-22T12:20:00.413 回答
1

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

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

更新

请注意,该接口的行为在 servlet 规范的 v2.4 中发生了变化。有关详细信息,请参见第 21 页

于 2009-12-22T10:53:59.647 回答
1

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

于 2009-12-22T11:00:39.337 回答