如何在会话对象被销毁之前调用方法?

时间:2011-10-13 14:53:19

标签: java tomcat servlets

开发JSP应用程序时,可以定义会话超时值,比如30分钟。

超时后,会话对象被销毁。 此外,我可以通过编程方式使会话调用session.invalidate()无效。

由于我在HTTP会话中保存了一个复杂的Java对象,在使会话无效或让tomcat app服务器过期之前,我需要调用一个保存的对象方法来释放一些内存。当然,当用户单击注销按钮时,我可以以编程方式执行此操作。

我想要做的是拦截Tomcat应用服务器,当它要销毁所有过期的会话(30分钟或自定义)时,这样我就可以预处理保存在会话中的Java对象,调用一个特定的方法来释放存储器中。

有可能吗?

1 个答案:

答案 0 :(得分:37)

是的,这是可能的。您可以使用HttpSessionListener并使用sessionDestroyed()方法

完成工作
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        // Do here the job.
    }

    // ...
}

您可以将存储为会话属性的复杂对象实现HttpSessionBindingListener,并使用valueUnbound()方法完成工作。

public class YourComplexObject implements HttpSessionBindingListener {

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        // Do here the job.
    }

    // ...
}

每当要从会话中删除对象时(无论是HttpSession#removeAttribute()显式还是通过会话的无效/过期),都会调用它。