2011-02-04 35 views
9

、...私は...session.invalidateを使用したJSFログアウトで現在のユーザー名がクリアされませんか?私のJSFアプリケーションで

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

を、現在、このようなユーザーに署名の名前を取得...と、ユーザーがこのようで署名されている場合、私はチェック

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

...とユーザがサインアウト、私はこれを行う...

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

私の問題はdoLogout()、getLoggedInUsername(後)で、まだログインしたユーザーの名前を返します。何getRemoteUser()がログアウト後にnullを返すことを確認するはずですか?

代わりに、ユーザー名を確認するだけでなく、isSignedIn()を取得する方法がありますか?

ありがとうございます! Rob

+0

関連するメソッド自体をデバッグしましたか、Webブラウザの動作に基づいて自分で推測しましたか?ページはブラウザのキャッシュから明白に要求されるかもしれません... – BalusC

+0

はい、私はそれをデバッグしました。私はdoLogout()メソッドを打ちました。完了後、getLoggedInUsername()を押してログインしたユーザーのユーザー名を返します(session.invalidateの実行後も)。何か案は? –

+1

リダイレクトを送信しているかどうかわかりません。 :)私はデフォルトの動作が何であれ、doLogOut()でブラウザが何をしていてもmain.jsfページを表示していることを示しています。(これはあなたが見るためにサインインする必要はありません)。それは役に立ちますか? –

答えて

16

セッションを無効にした後でリクエストをリダイレクトするようにしてください。ユーザープリンシパルは、セッション属性に基づいて解決されます。したがって、ターゲット・ページ(デフォルトではJSFナビゲーション・ケースのように)に転送すると、同じHttpSessionの参照を使用するため、ターゲット・ページにはそのまま残ります。リダイレクトはWebブラウザに新しいHTTP要求を発行するように指示します。これにより、サーバーは新しい要求に基づいてHttpSession参照を再作成します。

ナビゲーションケースに<redirect/>を追加して、JSFがリダイレクトを強制的に送信するようにします。または、すでにJSF 2.0になっている場合は、結果値に?faces-redirect=trueを追加します。

0

「session.invalidate();」の呼び出し後、 、 "request.logout();"を追加してください。

セッションオブジェクトを無効にする方法はセッションデータを消去するだけです。

メソッドlogout on requestオブジェクトgetUserPrincipal、getRemoteUserおよびgetAuthTypeがリクエストで呼び出されたときに返される値としてnullを設定します。

関連する問題