session - que - ¿Cómo invalidar la sesión en JSF 2.0?
que es managed bean (2)
En primer lugar, ¿este método es correcto? ¿Hay alguna manera sin tocar el ServletAPI?
Puede usar ExternalContext#invalidateSession()
para invalidar la sesión sin la necesidad de tomar la API del 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 bean con ámbito de sesión actual? ya que incluso el propio frijol se almacena en HttpSession?
Todavía estará accesible en la respuesta actual, pero ya no estará allí en la siguiente 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 usar un resultado de navegación es más simple.
¿Cuál es la mejor manera de invalidar sesión dentro de una aplicación JSF 2.0? Sé que JSF en sí no maneja la sesión. Hasta ahora pude encontrar
private void reset() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(false);
session.invalidate();
}
- ¿Es este método correcto? ¿Hay alguna manera sin tocar el ServletAPI?
- Considere un escenario en el que un
@SessionScoped
UserBean 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étodoreset()
después de terminar con las actualizaciones de base de datos necesarias, ¿qué sucederá con mi Bean con ámbito de sesión actual? ya que incluso el propio frijol se almacena enHttpSession
?
public void logout() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}