2011-04-11 33 views
55

¿Cuál es la mejor manera 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 he podido encontrar¿Cómo invalidar la sesión en JSF 2.0?

private void reset() { 
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance() 
      .getExternalContext().getSession(false); 
    session.invalidate(); 
} 
  1. ¿Es este método correcta? ¿Hay alguna manera de no tocar el ServletAPI ?
  2. Considere un escenario en el que un UserBean @SessionScoped maneja el inicio de sesión-cierre de 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 las actualizaciones necesarias de DB , ¿qué pasará con mi bean con ámbito de sesión actual? desde incluso el propio frijol se almacena en HttpSession?

Respuesta

117

En primer lugar, es correcta este método? ¿Hay alguna manera sin tocar el ServletAPI?

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

@ManagedBean 
@SessionScoped 
public class UserManager { 

    private User current; 

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

    // ... 

} 

lo que va a pasar con mi sesión actual con ámbito de frijol? ya que incluso el propio frijol se almacena en HttpSession?

Seguirá estando accesible en la respuesta actual, pero ya no estará allí en la próxima solicitud. Por lo tanto, es importante que una redirección (una nueva solicitud) se active después de la invalidación, de lo contrario, seguirá mostrando los datos de la sesión anterior. Se puede hacer una redirección agregando faces-redirect=true al resultado, como hice en el ejemplo anterior. Otra forma de enviar una redirección es usar 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.

+1

@BalusC, ¿cuál es la diferencia entre 'ExternalContext # invalidateSession()' y 'HttpSession # invalidate()'? – Patrick

+5

@Patrick: Funcionalmente, nada. Ambos hacen exactamente lo mismo. 'ExternalContext # invalidateSession()' llama bajo las cubiertas 'HttpSession # invalidate()' (ver también el enlace javadoc en mi respuesta). Diseño-técnicamente, el enfoque 'ExternalContext' es mejor. Básicamente debe esforzarse por tener ** cero ** 'javax.servlet. *' Importaciones en cualquiera de sus artefactos relacionados con JSF. – BalusC

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