k2nの日記: HttpSession.getLastAccessedTime()
日記 by
k2n
テスト中に、セッションにバインドしたオブジェクトがいなくなってしまう問題に遭遇。どうも、2回目にsetAttribute()を呼ぶといなくなっている。値を変更したときはいつでもこのメソッドを呼ばないとクラスタの他ノードに変更が反映されないのだ。
で、そのバインドされているクラスはHttpSessionBinderListenerを実装している。で、2回目以降のsetAttribute()では、いったんアンバインドされ、リバインドされている。したがってvalueUnbound()が呼ばれるのだ。
これはWeblogicでも経験したから、まあしょうがねぇか、と思う。で、本当のセッション期限切れによるvalueUnbound()と区別するために、セッションタイムアウトと、System.currentMillis() - HttpSession.getLastAccessedTime()を比較して、後者がでかければ本当のセッション切れとみなすというロジックを入れておいたのですよ、3年前に。
ところがなんと、Websphere5.0.2はそこで、getLastAccessedTime()の返り値として、マイナス1を返してくる。そんなのServletAPIで定義されていないだろ!よろしく頼みますよ、IBMさん!
[10/19] IBMのサポートと話した結果、最初のリクエストはセッションに属していないため、上で述べた振る舞いはスペックにのっとっているという回答。確かにそのように記述されている。でも、それなら、APIで例外を投げるか返り値を規定しておくべきではないだろうか。ちなみにTomcat4.17でもWeblogicと同様、最初のリクエストからタイムスタンプを返してくる。
HttpSession.getLastAccessedTime() More ログイン