アクセスの制限
アクセスの制限の処理をどこに入れるかについては、例外のハンドリングと同じことがいえる。
Web上にはNavigationHandlerに入れるという方法が示されていたが、このやり方だと「Invoke Applicationg」フェーズを通らないリクエスト(「Restore View」フェーズしか通らない場合など)であっさりとページが表示されてしまう。
これを避けるため、NavigationHandlerではなくLifeCycle#execute()の冒頭でアクセス制限のチェックをし、アクセスが許可されていない場合は適当なページを設定して終了するという形で実装する。
あと、忘れちゃいけないのが「JSPファイル直指定」への対応。
Servlet+JSPでガシガシコードを書いていたときにはWEB-INFの下にJSPファイルを置くことで対応していたが、JSFだとなんだかうまくいかない。
今回は「*.faces」でJSF Servletを呼んでいるので、下記のような設定をweb.xmlに入れることで対応する(JSF Servletにマッピングした拡張子と同じファイル拡張子にしておいた方が楽か?)。
<security-constraint> <web-resource-collection> <web-resource-name>Restrict direct access to JSP pages</web-resource-name> <url-pattern>*.jsp</url-pattern> </web-resource-collection> <auth-constraint> </auth-constraint> </security-constraint>