web-dev-qa-db-fra.com

Comment invalider une session dans JSF 2.0?

Quel est le meilleur moyen d’invalider une session dans une application JSF 2.0? Je sais que JSF lui-même ne gère pas la session. Jusqu'à présent, j'ai pu trouver

private void reset() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
            .getExternalContext().getSession(false);
    session.invalidate();
}
  1. Cette méthode est-elle correcte? Existe-t-il un moyen de ne pas toucher ServletAPI?
  2. Prenons un scénario dans lequel un @SessionScoped UserBean gère la déconnexion d'un utilisateur. J'ai cette méthode dans le même haricot. Maintenant, lorsque j'appelle la méthode reset() après avoir mis à jour les mises à jour de base de données nécessaires, qu'adviendra-t-il de mon bean périmé de session en cours? puisque même le haricot lui-même est stocké dans HttpSession?
58
Nikhil

Tout d'abord, cette méthode est-elle correcte? Existe-t-il un moyen de ne pas toucher ServletAPI?

Vous pouvez utiliser ExternalContext#invalidateSession() pour invalider la session sans avoir à saisir l'API Servlet.

@ManagedBean
@SessionScoped
public class UserManager {

    private User current;

    public String logout() {
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        return "/home.xhtml?faces-redirect=true";
    }

    // ...

}

qu'adviendra-t-il de ma session en cours? puisque même le haricot lui-même est stocké dans HttpSession?

Il sera toujours accessible dans la réponse actuelle, mais ne le sera plus dans la prochaine demande. Il est donc important qu'une redirection (une nouvelle demande) soit déclenchée après invalidation, sinon vous continuez d'afficher les données de l'ancienne session. Une redirection peut être effectuée en ajoutant faces-redirect=true Au résultat, comme je l'ai fait dans l'exemple ci-dessus. Une autre façon d’envoyer une redirection consiste à utiliser ExternalContext#redirect() .

public void logout() throws IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.invalidateSession();
    ec.redirect(ec.getRequestContextPath() + "/home.xhtml");
}

Son utilisation est toutefois discutable dans ce contexte car l’utilisation d’un résultat de navigation est plus simple.

124
BalusC
public void logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}
13
Stani