2011-02-04 4 views
9

En mi aplicación JSF, me sale el nombre del usuario actualmente firmado en como esto ...JSF logout using session.invalidate no borra el nombre de usuario actual?

public String getLoggedInUsername() { 
    return FacesContext.getCurrentInstance().getExternalContext().getRemoteUser(); 
} 

... y puedo comprobar si el usuario ha iniciado sesión como esta ...

public boolean isSignedIn() { 
    return (getLoggedInUsername() != null); 
} 

... y cuando los usuarios se fuera, que hacen esto ...

public String doLogout() { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    HttpSession httpSession = (HttpSession)facesContext.getExternalContext().getSession(false); 
    httpSession.invalidate(); 
    return "main"; 
} 

Mi problema es después de doLogout(), el getLoggedInUsername() sigue devolviendo el nombre del usuario que se ha conectado. Qué ¿se supone que debo hacer para asegurarme de que getRemoteUser() devuelva null después de cerrar la sesión?

Alternativamente, ¿hay una mejor manera de obtener si isSignedIn() que simplemente verificando el nombre de usuario?

Gracias! Rob

+0

¿Ha depurado los métodos involucrados en sí, o lo adivinó/concluyó usted mismo en función de cómo se comporta el navegador web? La página puede ser solicitada directamente desde el caché del navegador ... – BalusC

+0

Sí, lo depuré. Toco el método doLogout(), después de que está completo, presiono getLoggedInUsername() y devuelve el nombre de usuario del tipo que inició sesión (incluso después de ejecutar session.invalidate). ¿Algunas ideas? –

+1

No sé si estoy enviando un redireccionamiento. :) Supongo que estoy usando el comportamiento predeterminado, en doLogOut() el navegador deja la página en la que estaba y muestra la página main.jsf (que no tiene que haber iniciado sesión para verla, por cierto) ¿Eso ayuda? –

Respuesta

16

Asegúrese de estar redireccionando la solicitud después de invalidar la sesión. El principal de usuario se resuelve en función de un atributo de sesión. Por lo tanto, cuando reenvía a la página de destino (como lo hace un caso de navegación JSF de forma predeterminada), seguirá estando allí en la página de destino, ya que utiliza la misma referencia . Una redirección indica al navegador web que active una nueva solicitud HTTP, lo que obliga al servidor a recrear la referencia HttpSession en función de la nueva solicitud.

Agregue <redirect/> a la caja de navegación para forzar a JSF a enviar una redirección. O cuando ya esté en JSF 2.0, agregue ?faces-redirect=true al valor de resultado.

0

Después de la llamada "session.invalidate();" , agregue "request.logout();".

El método invalida en el objeto de sesión solo limpia los datos de la sesión.

El método logout al objeto request establece null como el valor devuelto cuando se llama a getUserPrincipal, getRemoteUser y getAuthType en la solicitud.

Cuestiones relacionadas