Cómo invalidar la sesión en JSF 2.0?


¿Cuál es la mejor manera posible de invalidar la sesión dentro de una aplicación JSF 2.0? Sé que JSF en sí no maneja la sesión. Hasta ahora podría encontrar

private void reset() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
            .getExternalContext().getSession(false);
    session.invalidate();
}
  1. ¿Es correcto este método? Hay una manera sin tocar el ¿ServletAPI?
  2. Considere un escenario en el que un UserBean @SessionScoped maneja el login-cerrar sesión de un usuario. Tengo este método en el mismo bean. Ahora cuando llamo al método reset() después de haber terminado con DB necesario actualizaciones, qué pasará con mi sesión actual ámbito de frijol? ya incluso el frijol en sí se almacena en HttpSession?
Author: Nikhil, 2011-04-11

2 answers

En primer lugar, ¿es correcto este método? ¿Hay alguna manera de no tocar el ServletAPI?

Puede utilizar ExternalContext#invalidateSession() para invalidar la sesión sin necesidad de tomar la API de Servlet.

@ManagedBean
@SessionScoped
public class UserManager {

    private User current;

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

    // ...

}

¿qué pasará con mi sesión actual scoped bean? ¿ya que incluso el bean se almacena en HttpSession?

Seguirá siendo accesible en la respuesta actual, pero ya no estará allí en la siguiente solicitud. Por lo tanto, es importante que se active una redirección (una nueva solicitud) después de invalidar, de lo contrario, aún estará mostrando datos de la sesión anterior. Una redirección se puede hacer agregando faces-redirect=true al resultado, como hice en el ejemplo anterior. Otra forma de enviar una redirección es usando ExternalContext#redirect().

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

Sin embargo, su uso es cuestionable en este contexto, ya que el uso de un resultado de navegación es más simple.

 121
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-23 13:55:24
public void logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}
 13
Author: Stani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-11 08:55:08