V mojej aplikácii JSF dostanem meno aktuálne prihláseného používateľa, ako je tento ...
public String getLoggedInUsername() {
return FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
}
... a skontrolujem, či je používateľ prihlásený takýmto spôsobom ...
public boolean isSignedIn() {
return (getLoggedInUsername() != null);
}
... a keď sa používateľ odhlási, urobím to ...
public String doLogout() {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession httpSession = (HttpSession)facesContext.getExternalContext().getSession(false);
httpSession.invalidate();
return "main";
}
Môj problém je po doLogout (), getLoggedInUsername () stále vracia meno prihláseného používateľa. Čo mám robiť, aby som sa ubezpečil, že getRemoteUser () sa po odhlásení vráti na nulu?
Existuje aj lepší spôsob, ako zistiť, či je isSignedIn (), než len skontrolovať používateľské meno?
Vďaka! olúpiť
odpovede:
16 pre odpoveď č. 1Uistite sa, že žiadosť presmerujete pozneplatnenie relácie. Princíp užívateľa je vyriešený na základe atribútu relácie. Takže keď práve prechádzate na cieľovú stránku (ako v predvolenom nastavení ako prípad navigácie JSF), bude na cieľovej stránke stále, pretože používa rovnaký HttpSession
referencie. Presmerovanie dá pokyn webový prehliadač, aby vystrelil úplne novú požiadavku HTTP, čím núti server znovu vytvoriť HttpSession
odkaz založený na novej žiadosti.
pridať <redirect/>
do navigačného puzdra núti JSF poslať presmerovanie. Alebo, keď už ste v JSF 2.0, pridajte ?faces-redirect=true
na výslednú hodnotu.
0 pre odpoveď č. 2
Po volaní „session.invalidate ();“ , pridajte reťazec „request.logout ();“.
Metóda zneplatnenia objektu relácie iba čisté údaje relácie.
Odhlásenie metódy na objekte žiadosti nastaví na hodnotu null ako hodnotu vrátenú pri volaní getUserPrincipal, getRemoteUser a getAuthType.