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

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

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

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

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

可能吗?

是的,那是可能的。 你可以使用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()显式或通过会话的失效/到期)。