現在作成しているwebプロトにて、ログインしていない状態で、あるページのURLを直接入力された場合にページが表示されたりすることを防ぐために、バックビーンのコンストラクタでログイン済みかどうかのチェックを入れています。ログインしていなければエラーページにリダイレクトする形です。
方法は他にも色々ありそうで
JSF内でSystemEventを使う
<f:event listener="#{xxxBean.hasLoginAuth()}" type="preRenderView" />
とかも使えます。他にも
http://stackoverflow.com/questions/6137475/glassfish-3-1-problem-with-faces
http://stackoverflow.com/questions/13158887/prevent-direct-access-to-xhtml-files-in-jsf-2
等。
で、URLの直接入力パターンを色々試していたのですが、例えば
ttp://hogehoge/Prototype/faces/folderName/pageName.xhtml
のようなURLで「/faces」を抜いて
ttp://hogehoge/Prototype/folderName/pageName.xhtml
と打った所、真っ白なhtmlページが表示されました。確認するとビーンのコンストラクタは呼ばれてません。これはいかん、と試しにSystemEvent使う方法でもやってみましたが…来ません。PhaseListenerも使ってみたけど来ない。
困ったときの「Core JavaServerFaces THIRD EDITION」!
を調べると、おお、p.20に記述がありました。
CAUTION:If you view a JSF page without the /faces prefixi, the browser will display the HTML tags in the page, but it will simply skip the JSF tags.
/facesの接頭辞を抜くとJSFタグをスキップしたHTMLタグがでますよ、と。あれ、これだけ…?
URLと中身を考えるとAPサーバ的には単なるxhtmlを開いただけ(JSFとか関係なく)な認識になってるので、GlassFish側でアクセス制御しないといけない話なのでしょうか…??
これを防ぐにはどうしたらいいのか調べてますが中々良い情報がないです。うーん。
【追記】
と、ここまで書いた後、そもそもURLから「/faces」抜きたい…という流れになり、調べた所、上記の本で
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
を
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
にする方法が。Stackoverflowでも何がスタンダードか?という質問に同じ記述がありました。
http://stackoverflow.com/questions/466858/what-is-the-standard-way-to-handle-url-mapping-for-javaserver-faces
今度は拡張子facesが気になるけど…。最初に掲げた問題は解決するなぁ。
【追記の追記】
と思ったけれど、結局、URLの拡張子.facesを.xhtmlにしたら同じことでした orz
別にユーザ情報が見えちゃうとか、害があるわけではないから諦めるか…うーん。
と思いきや、*.xhtmlにしてみたら、思う通りに動いた。アリなのかな…。
途中からトライ&エラー方式になってるので、もう少しちゃんと調べて判定しなければ。