2011年5月18日水曜日

JSF(Teeda) フェーズリスナでセッション存在チェック

JSFを用いたWEBアプリケーションの作成において、
セッションの存在チェックをどのタイミングで行うのが
正解なのか。

まず、Actionにインターセプターを設定してセッション存在チェックを
行おうと考えたが、rendererやConverter、Validatorを
拡張実装してスコープやセッションから値を取得している場合に、
チェックより前なので、ヌルポ等の予期せぬエラーが発生する可能性がある。

次に、filterでセッションチェックを行おうと考えていたが、
filterはTeeda管理外なので、エラー発生の場合Teedaで設定した
エラー画面とならず、HTTPステータスエラー画面になってしまう
(web.xmlのerror-pageで設定していれば別)。

今回はrendererのdecode処理でもセッションを使用する拡張等を
行っていたので、リクエスト適応フェーズ前にチェックを
行う必要があるため、フェーズリスナーでセッション存在チェックを
実装しようと思います。

JSFではフェーズごとにリスナーで処理をいれることができ、
フェーズリスナーの下記タイミングでチェックを行うことで
renderer、Converter、Validatorより前にチェックできる。

POST
1.RESTORE_VIEW(Page状態復元 スコープ管理機能中間モデルの復元)
→→→ ここでセッションチェック ←←←
2.APPLY_REQUEST_VALUES(中間モデルにリクエスト値の適応)※renderer(decode)
3.PROCESS_VALIDATIONS(バリデーション) ※Converter、Validator実行
4.UPDATE_MODEL_VALUES(Pageクラスのプロパティ更新)
5.INVOKE_APPLICATIONS(アクション実行)
GET
6.RENDER_RESPONSE(レンダリング)※renderer(encode)→initialize(初回)→prerender



 <lifecycle>
  <phase-listener>
   test.listener.SessionCheckListener
  </phase-listener>
 </lifecycle>


package test.listener;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;
・・・

public class SessionCheckListener implements PhaseListener {

    public void beforePhase(PhaseEvent event) {
        //リクエスト適応フェーズ前にセッションチェック処理
        ・・・
    }
    
    //リクエスト適応フェーズ後は何もしない
    public void afterPhase(PhaseEvent event) {}

    public PhaseId getPhaseId() {
        //リクエスト適応フェーズ
        return PhaseId.APPLY_REQUEST_VALUES;
    }
}    


あと、リクエストが違うので念のため
「6.RENDER_RESPONSE(レンダリング)」前
にもセッション存在チェックを入れました。

0 件のコメント:

コメントを投稿