JSF の login page と servlet の timeout
ログインしても無視されて、もう一度ログインしたらログインできる、という現象があるというので考えてみた。
JSF で用意した login page に username と password を入力できるように Managed bean を置いておくと、入力した内容が入ったオブジェクトがプログラムに渡り、おきまりの手順の処理が行われる。
では、この login page を放置しておくとどうなるか。クライアントを放置しておくと、servlet (tomcat) は session timeout に指定された時間待って、その後 session が開放される。このとき、JSF の View も開放され、Managed bean も行き場を失う。しかし、ブラウザ上には、かなり前に表示したままの login page が残っている。ここに username と password を入力して、login ボタンを押すとどうなるか?
当然、action に指定されたメソッドを呼び出すためのオブジェクトは存在しない。そもそも、view が消滅しているから、JSF の Lifecycle としては、Phase 1 の Restore View が実行されたときに、デフォルトの状態をとりあえず用意するだけで、いきなり Phase 6 の Render Response フェーズまでスキップする。その結果、入力した username と password は無視され、再びログイン画面が表示される。
つまり、ログイン画面が session timeout していなければ、ログインの処理は成功する。さて、ここで問題なのだが、ログイン画面が表示された状態で長時間放置して、session timeout が発生したときも、username と password を 1度だけ入力してログインするようにしたい。