web-dev-qa-db-ja.com

JSF 2.0でセッションを無効にする方法は?

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

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

まず、この方法は正しいですか? 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");
}
_

ただし、ナビゲーションの結果を使用する方が簡単なので、このコンテキストでの使用は疑わしいです。

124
BalusC
public void logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}
13
Stani