Mon application Web a des utilisateurs qui se connectent. Il y a un timeout. Avant l'expiration de la session, je voudrais exécuter une méthode pour nettoyer certains verrous.Méthode Invoke juste avant l'expiration de la session
Je l'ai mis en place un sessionListener
mais une fois que j'arrive public void sessionDestroyed(HttpSessionEvent event)
la session est déjà parti et j'ai besoin des données qu'il contient, donc je voudrais exécuter une méthode (qui a besoin de la session en vie et être en mesure d'accéder FacesConfig.getCurrentInstance()
) avant la session est réellement expirée.
Comment puis-je faire cela? Des idées? Ceci est ma session Listener:
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());
}
}
Mais je reçois NullPointerException
à FacesContext.getCurrentInstance().getApplication()
soit parce getCurrentInstance
est nulle ou getApplication
retourne NULL
Fonctionne comme un charme. +1 et accepté – pakore
Je l'ai mis sous la classe 'UserBean', qui connaît' LockBean'. Je l'avais déjà implémenté à partir d'une question précédente, répondue par ... BalusC: D, donc j'avais juste besoin d'ajouter la ligne 'lock.unlock' et ça a marché. Merci à vous deux. – pakore
L'implémentation de 'HttpSessionBindingListener' est en effet préférable. Vous n'avez qu'à vous assurer que 'registerSession()' est appelé lors d'une requête JSF (cependant, cette méthode est inutile si 'ObjectLock' est déjà un bean géré de session.) – BalusC