62

JSF 2.0アプリケーション内のセッションを無効にするための最良の方法は何ですか?JSF自体がセッションを処理しないことは知っています。これまでのところ私は見つけることができました

private void reset() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
            .getExternalContext().getSession(false);
    session.invalidate();
}
  1. この方法は正しいですか?ServletAPIに触れずに方法はありますか?
  2. @SessionScopedUserBeanがユーザーのログイン-ログアウトを処理するシナリオを考えてみましょう。私は同じBeanでこのメソッドを使用しています。必要なDBの更新が完了した後でメソッドを呼び出すとreset()、現在のセッションスコープのBeanはどうなりますか?Bean自体も?に保存されているのでHttpSession
4

3 に答える 3

125

まず、この方法は正しいですか?ServletAPIに触れずに方法はありますか?

ExternalContext#invalidateSession()サーブレットAPIを取得せずに、セッションを無効にするために使用できます。

@ManagedBean
@SessionScoped
public class UserManager {

    private User current;

    public String logout() {
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        return "/home.xhtml?faces-redirect=true";
    }

    // ...

}

現在のセッションスコープのBeanはどうなりますか?Bean自体もHttpSessionに保存されているので?

現在の応答では引き続きアクセスできますが、次の要求ではアクセスできなくなります。したがって、無効化後にリダイレクト(新しいリクエスト)が実行されることが重要です。そうしないと、古いセッションのデータが引き続き表示されます。faces-redirect=true上記の例で行ったように、結果に追加することでリダイレクトを実行できます。リダイレクトを送信する別の方法は、を使用することExternalContext#redirect()です。

public void logout() throws IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.invalidateSession();
    ec.redirect(ec.getRequestContextPath() + "/home.xhtml");
}

ただし、ナビゲーション結果の使用はより簡単であるため、このコンテキストではその使用には疑問があります。

于 2011-04-11T11:25:54.213 に答える
13
public void logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}
于 2012-07-19T09:57:04.027 に答える
-1

フロントエンドコードは次のとおりです。

<h:form>
<h:commandLink action="#{userManager.logout()}">
       <span>Close your session</span>
</h:commandLink>
</h:form>

バックエンドコードは次のとおりです。

public String logout() {
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    if (session != null) {
        session.invalidate();
    }
    return "/login.xhtml?faces-redirect=true";  
}
于 2020-12-11T11:21:29.230 に答える