Como invalidar a session no JSF 2.0?

Qual é a melhor maneira possível de invalidar a session dentro de um aplicativo JSF 2.0? Eu sei que o próprio JSF não manipula a session. Até agora eu consegui encontrar

private void reset() { HttpSession session = (HttpSession) FacesContext.getCurrentInstance() .getExternalContext().getSession(false); session.invalidate(); } 
  1. Este método está correto? Existe uma maneira sem tocar o ServletAPI?
  2. Considere um cenário em que um @SessionScoped @SessionScoped manipula o login-logout de um usuário. Eu tenho esse método no mesmo bean. Agora, quando eu chamo o método reset() depois de concluir as atualizações de database necessárias, o que acontecerá com meu bean com escopo de session atual? já que até o próprio bean é armazenado no HttpSession ?

    Em primeiro lugar, este método é correto? Existe uma maneira sem tocar o ServletAPI?

    Você pode usar ExternalContext#invalidateSession() para invalidar a session sem precisar pegar a API do Servlet.

     @ManagedBean @SessionScoped public class UserManager { private User current; public String logout() { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); return "/home.xhtml?faces-redirect=true"; } // ... } 

    o que acontecerá com meu bean com escopo de session atual? já que até o próprio bean é armazenado no HttpSession?

    Ele ainda estará acessível na resposta atual, mas não estará mais lá na próxima solicitação. Portanto, é importante que um redirecionamento (uma nova solicitação) seja acionado após a invalidação, caso contrário, você ainda estará exibindo dados da session antiga. Um redirecionamento pode ser feito adicionando faces-redirect=true ao resultado, como fiz no exemplo acima. Outra maneira de enviar um redirecionamento é usando ExternalContext#redirect() .

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

    Seu uso é, no entanto, questionável neste contexto, pois usar um resultado de navegação é mais simples.

     public void logout() { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); }