Mi aplicación web tiene usuarios que inician sesión. Hay un tiempo de espera. Antes de que la sesión expire, me gustaría ejecutar un método para limpiar algunos bloqueos.Método de invocación justo antes de que la sesión caduque
he implementado un sessionListener
pero una vez que llegue public void sessionDestroyed(HttpSessionEvent event)
la sesión ya se ha ido y necesito algunos datos de él, así que le gustaría ejecutar un método (que necesita la sesión activa y ser capaz de acceder FacesConfig.getCurrentInstance()
) antes la sesión en realidad ha expirado.
¿Cómo puedo hacer eso? ¿Algunas ideas? Este es mi sesión de escucha:
public class MySessionListener implements HttpSessionListener {
private static final Logger log = LoggerFactory.getLogger(MySessionListener.class);
public MySessionListener() {
}
public void sessionCreated(HttpSessionEvent event) {
log.debug("Current Session created : "
+ event.getSession().getId()+ " at "+ new Date());
}
public void sessionDestroyed(HttpSessionEvent event) {
// get the destroying session...
HttpSession session = event.getSession();
prepareLogoutInfoAndLogoutActiveUser(session);
log.debug("Current Session destroyed :"
+ session.getId()+ " Logging out user...");
/*
* nobody can reach user data after this point because
* session is invalidated already.
* So, get the user data from session and save its
* logout information before losing it.
* User's redirection to the timeout page will be
* handled by the SessionTimeoutFilter.
*/
// Only if needed
}
/**
* Clean your logout operations.
*/
public void prepareLogoutInfoAndLogoutActiveUser(HttpSession httpSession) {
UserBean user = FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{user}", UserBean.class);
LockBean lock = FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{lock}", LockBean.class);
lock.unlock(user.getUsername());
log.info("Unlocked examination for user: "+user.getUsername());
}
}
Pero estoy NullPointerException
en FacesContext.getCurrentInstance().getApplication()
porque o getCurrentInstance
es nulo o getApplication
devuelve NULL
Funciona como un encanto. +1 y aceptado. – pakore
Lo puse bajo la clase 'UserBean', que conoce' LockBean'. Ya había implementado esto desde una pregunta anterior respondida por ... BalusC: D, así que solo necesitaba agregar la línea 'lock.unlock' y funcionó. Gracias a los dos. – pakore
Implementar 'HttpSessionBindingListener' es realmente mejor. Solo necesita asegurarse de que se llama a 'registerSession()' durante una solicitud de JSF (sin embargo, ese método es inútil si 'ObjectLock' ya es un bean administrado con ámbito de sesión. – BalusC