JSF アプリでセッション生成を抑制する方法

JSF アプリの課題

ソースコードとか仕様とか詳細まで確認はできていないのですが、一般的に JSF はステートフルなサービスであるため、JSF アプリの動作としてはどうしてもセッションが生成されてしまうかと思います。


そのため、JSF を用いた Web アプリでログイン前にアクセス可能な画面(ログイン画面、ヘルスチェック用画面など)にアクセスしただけで内部的にセッションが生成されてしまう動作になるかと思います。


解決案

同じ会社の方から教えていただいた情報なのですが、JSF の EL 式による暗黙オブジェクトを用いて画面が表示されるタイミングでセッションを無効化することが可能です。 具体的には下記のように JSF 画面定義の <head> タグ上に #{session.invalidate()} を指定することで対応できます。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core">
#{session.invalidate()}
    <head>
        <title>Test</title>
    </head>
    <body>
        <h1>invalidate テスト</h1>
    </body>
</html> 


上記のように対応することで、JSF 処理が行われた際に内部的には一旦セッションが生成されてしまいますが、画面を表示する時に #{session.invalidate()} 定義によってセッションが破棄される動作となり、結果的に特定画面へアクセスした際にセッションが生成されることを抑制することができます。(一旦生成されているので抑制できていると言い切ってしまうのは微妙ではありますが…)


まとめ

もう JSF の話ではない気もしますが、検索しても参考となる情報が見つからなかったためちょっとした Tips として整理させていただきました。