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

2022-09-02 09:12:17

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

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

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

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

可能吗?


答案 1

是的,这是可能的。您可以使用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()


答案 2

推荐