【问题标题】:attributeRemoved not being called after session.invalidate在 session.invalidate 之后没有调用 attributeRemoved
【发布时间】:2009-11-26 10:21:22
【问题描述】:

我有一个实现HttpSessionAttributeListener 的对象,正如您所期望的,当某些对象被添加、替换和从会话中删除时,它会做一些工作。

我认为如果会话结束 [session.invalidate()],该会话中的每个对象都会从会话中删除,以便调用 attributeRemoved() 方法?我没有看到这种行为,我想知道我是否在做梦。

为确保在会话无效时可以通知我,我是否必须在我感兴趣的对象上实现HttpSessionBindingListener?还是有其他方法。

【问题讨论】:

    标签: java session servlets


    【解决方案1】:

    当您调用session.invalidate() 时,您只是在通知容器不应再使用该会话。但是,它没有义务做任何其他事情,例如删除会话属性。它最终会这样做,但不能保证它会立即这样做,并且您的应用程序不应依赖它及时发生。

    【讨论】:

    • 谢谢,您知道 session.invalidate() 是否会导致容器通知会话对象(实现 HttpSessionBindingListener)它们现在已解除绑定?
    • 它应该在他们解除绑定时通知他们,但这可能在会话失效后的任何时候发生,不保证何时。
    【解决方案2】:

    HttpSessionListener,实现方法sessionDestroyed

    【讨论】:

    • 当 sessionDestroyed 你不能从会话中取出任何对象,如果你尝试我想你会得到 sessionInvlaidException (或类似的异常)
    • 好吧,我没试过,但是看看Tomcat的代码,似乎在会话无效和属性被删除之前调用了监听器。
    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多