JSF 2.0アプリケーション内でセッションを無効にする最良の方法は何ですか? JSF自体はセッションを処理しません。これまでのところ、私は見つけることができました
_private void reset() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(false);
session.invalidate();
}
_
@SessionScoped
_ UserBeanがユーザーのログインとログアウトを処理するシナリオを考えます。同じBeanにこのメソッドがあります。必要なDBの更新が完了した後でreset()
メソッドを呼び出すと、現在のセッションスコープBeanはどうなりますか? Bean自体もHttpSession
に格納されているためですか?まず、この方法は正しいですか? 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");
}
_
ただし、ナビゲーションの結果を使用する方が簡単なので、このコンテキストでの使用は疑わしいです。
public void logout() {
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}