- - PR -
セッションタイムアウト時間について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-09-15 19:08
こんばんは。
本日はじめて投稿させていただきます。 どうぞよろしくお願いいたします。 現在tomcat 4.1.27,struts 1.2.7を用いて開発を行っています。 tomcatのセッションタイムアウト時間の設定は30分です。 現在以下のようになってしまい困っています。 @表示した画面を30分くらい放置後ボタン押下 ↓ Aボタン押下後に遷移するアクションの中でセッションタイムアウト時間になる ↓ BHttpSessionListenerのsessionDestroyedが実行され、 開放処理が行われてしまう。 ↓ CAのアクションで必要とされる情報がBの開放処理で なくなってしまいExceptionになってしまう。 tomcatの仕様でセッションタイムアウト時間は前回のアクセス時間に依存している らしいです。このセッションタイムアウト時間を前回のアクセスからではなく今回 のアクセスからカウントされるようにできれば解決するのですが、できないですか!? ご教授お願いします。 | ||||
|
投稿日時: 2006-09-15 19:28
解決策の提供ではないですが、 「Aのアクションで必要とされる情報」 ってどんなものなのでしょうか? | ||||
|
投稿日時: 2006-09-15 19:35
tetoさん
ありがとうございます 「Aのアクションで必要とされる情報」 は ログインユーザー情報、コネクション情報などです。 | ||||
|
投稿日時: 2006-09-15 21:50
http://hp.vector.co.jp/authors/VA000137/tomcat-session-timeout-bug.html のことですかね? 41系の最新ではなおっているのかなぁ?よく覚えてない。。 直っているのならバージョンアップを検討(4.1.27はほかにも脆弱性があるらしいし) tomcatのソース修正も簡単だとおもいますので、そちらでも よろしいのかと思います。 | ||||
|
投稿日時: 2006-09-16 00:06
本当に解決しますか? 記述されている現象はセッションタイムアウトが発生すると必ず発生しますよね。 発生させないためにはタイムアウトを起こさせないということですが、ありえません。運用上。 「ログインユーザ情報」は失われても良いはずのモノですよね。もうログインしていないわけですから。 前処理用の共通処理部分を作って、アクション呼び出し前に必ず呼び出されるようにしてそこでセッションの存在をチェック。セッションがなければタイムアウト画面(ログイン画面)が常套手段でしょうか。 「コネクション情報」も同様でしょう。 (もしコネクションプーリングをセッションで管理、ならそれはやめましょう。) | ||||
|
投稿日時: 2006-09-19 01:28
tetoさん
ありがとうございます http://hp.vector.co.jp/authors/VA000137/tomcat-session-timeout-bug.html を参考にやってみたのですが、どうしてもリクエストが上がった時点からカウントされるようになりません。これは間違っているのですか!? | ||||
|
投稿日時: 2006-09-19 01:33
暁さん
ありがとうございます 引用: -------------------------------------------------------------------------------- 記述されている現象はセッションタイムアウトが発生すると必ず発生しますよね。 発生させないためにはタイムアウトを起こさせないということですが、ありえません。運用上。 -------------------------------------------------------------------------------- タイムアウトは起こっていいのですが、起こるタイミングの問題です。 リクエストが上がった時点から、セッションタイムがカウントされるようになれば、今回の現象は解決されると考えております。 | ||||
|
投稿日時: 2006-09-19 20:56
返答ではなく、便乗を。。
参照ページの修正対象↓が、なぜ駄目なのかわかりません。 int timeIdle = (int) ((timeNow - lastAccessedTime) / 1000L); 本当のバグのようですが、前回アクセス時刻から今回アクセス時刻までの間に経過した時間がタイムアウト時間を過ぎていたらセッションが切れる、というのは理屈に合わないのですか??? 修正後のコード↓だと、0に近い数字になって、タイムアウトにならないのではないでしょうか???(現在時刻−今回アクセス時間≒0???) int timeIdle = (int) ((timeNow - thisAccessedTime) / 1000L); [ メッセージ編集済み 編集者: ほーち 編集日時 2006-09-19 20:58 ] |