パスワードを忘れた? アカウント作成
431811 journal

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と同様、最初のリクエストからタイムスタンプを返してくる。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人

読み込み中...