10

私の 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() を取得するより良い方法はありますか?

ありがとう!ロブ

4

2 に答える 2

17

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

ナビゲーションケースに追加<redirect/>して、JSF にリダイレクトを送信させます。または、すでに JSF 2.0 を使用?faces-redirect=trueしている場合は、結果の値に追加します。

于 2011-02-04T15:16:50.563 に答える
0

「session.invalidate();」の呼び出し後 、「request.logout();」を追加します。

セッションオブジェクトのメソッド無効化は、セッションデータを消去するだけです。

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

于 2014-10-17T09:16:58.687 に答える