2011-02-04 7 views
9

Nella mia applicazione JSF, ottengo il nome dell'utente attualmente firmato a utente come questo ...Il logout JSF utilizzando session.invalidate non cancella il nome utente corrente?

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

... e verifico se l'utente ha eseguito l'accesso come questo ...

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

... e quando l'utente segni fuori, faccio questo ...

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

il mio problema è dopo doLogout(), il getLoggedInUsername() restituisce ancora il nome dell'utente che è stato registrato. Che cosa dovrei fare per assicurarmi che getRemoteUser() restituisca null dopo il logout?

In alternativa, c'è un modo migliore per ottenere se isSignedIn() piuttosto che controllare il nome utente?

Grazie! Rob

+0

Hai eseguito il debug dei metodi in questione o l'hai indovinato/concluso in base a come si comporta il browser web? La pagina potrebbe essere richiesta semplicemente dalla cache del browser ... – BalusC

+0

Sì, l'ho debugato. Ho colpito il metodo doLogout(), dopo che è stato completato, ho colpito getLoggedInUsername() e restituisce il nome utente del ragazzo che ha effettuato l'accesso (anche dopo che è stata eseguita la session.invalidate). Qualche idea? –

+1

Non so se sto inviando un reindirizzamento. :) Suppongo che sto usando qualunque sia il comportamento predefinito, su doLogOut() il browser lascia la pagina in cui mi trovavo e mostra la pagina main.jsf (che non è necessario accedere per vedere, a proposito). Questo aiuta? –

risposta

16

Assicurarsi di reindirizzare la richiesta dopo l'annullamento della sessione. L'utente principale viene risolto in base a un attributo di sessione. Pertanto, quando si esegue semplicemente l'inoltro alla pagina di destinazione (come per impostazione predefinita un caso di navigazione JSF), sarà comunque presente nella pagina di destinazione poiché utilizza lo stesso stessoHttpSession riferimento. Un reindirizzamento indica al browser web di generare una nuova richiesta HTTP, costringendo il server a ricreare il riferimento HttpSession in base alla nuova richiesta.

Aggiungere <redirect/> al caso di spostamento per forzare JSF a inviare un reindirizzamento. O quando sei già in JSF 2.0, aggiungi ?faces-redirect=true al valore del risultato.

0

Dopo la chiamata "session.invalidate();" , aggiungi "request.logout();".

Metodo invalido per oggetto sessione solo dati di sessione puliti.

Il metodo di disconnessione su richiesta oggetto stabilisce null come valore restituito quando getUserPrincipal, getRemoteUser e getAuthType viene chiamato sulla richiesta.

Problemi correlati