JSFで、セッションタイムアウトをハンドリングしたい、と聞くと、「ViewExpiredException」拾って何かする、くらいしか知識がなかったのですが…(^^;(というか前のPrjはそうしてた)
後輩にHttpSessionListenerを教えてもらいました。
んー、いまだにちょっとServletとJSFの関係がイマイチちゃんと理解できていない気が。
Servletの上にJSFがいる、ぐらいな。
HttpSessionListener、内容的には以下サイトがわかりやすい。
http://www.techscore.com/tech/Java/JavaEE/Servlet/8/
これ使えばセキュリティ要件でログイン後にセッションID変える必要がある場合(本来は普通にするべきなのかも…だけど)とか、簡単にできそうな気も。
package jp.co.hoge.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionHandler implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Sessionつくるのをフック" + se.getSession().getId());
se.getSession().setAttribute("hogehoge", "ほげほげ");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Sessionしんだのをフック" + se.getSession().getId());
}
}
また管理ビーンで以下のように値を取ることも。
HttpSession se = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false);
System.out.println(se.getAttribute("hogehoge") + se.getId());
ほげほげ824e074d64acd84f86e648717f94
JSFの各PhaseListenerとどういう関係になるのか、とか調べてみたい。
はぁ。まだまだ知らないこと多い…。