JSFでWebアプリケーションを作成していたときにViewExpiredExceptionが発生する場合の対策。
何も設定しない状態でJSFでアプリケーションを作成するとセッションタイムアウトした状態で、ページの更新を行うと例外が発生(ViewExpiredException)が発生する。
これはコンポーネントツリーが構築できなかったから発生しています。
これへの対策は下記の記述をweb.xmlに追記します。
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/login.xhtml</location>
</error-page>
コンポーネントツリーの状態をブラウザに保持させて、サーバー側に持たせないようにする。また、念のために例外が発生した場合に備えて、画面の遷移先を記述しています。
ネットで検索してみましたが、一定時間ごとに通信をさせるという方法を取っている方もいましたが、少なくとも単純な画面遷移であれば、今回の内容で問題ないかと思われます。おそらくSessionScopeなどを設定されている場合には必ずサーバー側に画面表示のために必要な情報があるために、今回の対策では不十分な場合があるかと思います。
JavaEE7 のViewExpiredExceptionの詳細は内容は以下のURLより
http://docs.oracle.com/javaee/7/api/javax/faces/application/ViewExpiredException.html