¿Cómo llamar a un método antes de que se destruya el objeto de sesión?

Al desarrollar una aplicación JSP, es posible definir un valor de tiempo de espera de la sesión, digamos 30 minutos.

Después de ese tiempo de espera, el objeto de sesión se destruye. Además, puedo invalidar mediante progtwigción una sesión que llame a session.invalidate ().

Como estoy guardando un objeto complejo de Java dentro de la sesión HTTP, antes de invalidar la sesión o dejar que caduque en el servidor de la aplicación tomcat, necesito llamar a un método de objeto guardado para liberar algo de memoria. Por supuesto que puedo hacerlo de forma programática cuando el usuario hace clic en un botón de cerrar sesión.

Lo que me gustaría hacer es interceptar el servidor de la aplicación Tomcat cuando vaya a destruir todas las sesiones expiradas (30 minutos o personalizadas), de modo que pueda preprocesar los objetos Java guardados en la sesión llamando a un método específico para liberar memoria.

¿Es posible?

Sí, eso es posible Puede usar HttpSessionListener y hacer el trabajo en el método sessionDestroyed() ,

 @WebListener public class MyHttpSessionListener implements HttpSessionListener { @Override public void sessionDestroyed(HttpSessionEvent event) { // Do here the job. } // ... } 

O puede dejar que el objeto complejo que se ha almacenado como atributo de sesión implemente HttpSessionBindingListener y haga el trabajo en el método valueUnbound() .

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

Se HttpSession#removeAttribute() siempre que el objeto se elimine de la sesión (explícitamente mediante HttpSession#removeAttribute() o mediante una invalidación / caducidad de la sesión).