- PR -

セッションタイムアウト時間について

投稿者投稿内容
我利
会議室デビュー日: 2006/09/15
投稿数: 7
投稿日時: 2006-09-15 19:08
こんばんは。
本日はじめて投稿させていただきます。
どうぞよろしくお願いいたします。

現在tomcat 4.1.27,struts 1.2.7を用いて開発を行っています。
tomcatのセッションタイムアウト時間の設定は30分です。

現在以下のようになってしまい困っています。

@表示した画面を30分くらい放置後ボタン押下
        ↓
Aボタン押下後に遷移するアクションの中でセッションタイムアウト時間になる
        ↓
BHttpSessionListenerのsessionDestroyedが実行され、
 開放処理が行われてしまう。
        ↓
CAのアクションで必要とされる情報がBの開放処理で
 なくなってしまいExceptionになってしまう。

tomcatの仕様でセッションタイムアウト時間は前回のアクセス時間に依存している
らしいです。このセッションタイムアウト時間を前回のアクセスからではなく今回
のアクセスからカウントされるようにできれば解決するのですが、できないですか!?

ご教授お願いします。
teto
ベテラン
会議室デビュー日: 2002/07/31
投稿数: 61
投稿日時: 2006-09-15 19:28
引用:

CAのアクションで必要とされる情報がBの開放処理で
 なくなってしまいExceptionになってしまう。



解決策の提供ではないですが、
「Aのアクションで必要とされる情報」
ってどんなものなのでしょうか?
我利
会議室デビュー日: 2006/09/15
投稿数: 7
投稿日時: 2006-09-15 19:35
tetoさん
ありがとうございます

「Aのアクションで必要とされる情報」 は
ログインユーザー情報、コネクション情報などです。
teto
ベテラン
会議室デビュー日: 2002/07/31
投稿数: 61
投稿日時: 2006-09-15 21:50
引用:

tomcatの仕様でセッションタイムアウト時間は前回のアクセス時間に依存している
らしいです。このセッションタイムアウト時間を前回のアクセスからではなく今回
のアクセスからカウントされるようにできれば解決するのですが、できないですか!?



http://hp.vector.co.jp/authors/VA000137/tomcat-session-timeout-bug.html
のことですかね?

41系の最新ではなおっているのかなぁ?よく覚えてない。。
直っているのならバージョンアップを検討(4.1.27はほかにも脆弱性があるらしいし)
tomcatのソース修正も簡単だとおもいますので、そちらでも
よろしいのかと思います。

大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2006-09-16 00:06
コード:
tomcatの仕様でセッションタイムアウト時間は前回のアクセス時間に依存している
らしいです。このセッションタイムアウト時間を前回のアクセスからではなく今回
のアクセスからカウントされるようにできれば解決するのですが、できないですか!?


本当に解決しますか?
記述されている現象はセッションタイムアウトが発生すると必ず発生しますよね。
発生させないためにはタイムアウトを起こさせないということですが、ありえません。運用上。

「ログインユーザ情報」は失われても良いはずのモノですよね。もうログインしていないわけですから。
前処理用の共通処理部分を作って、アクション呼び出し前に必ず呼び出されるようにしてそこでセッションの存在をチェック。セッションがなければタイムアウト画面(ログイン画面)が常套手段でしょうか。
「コネクション情報」も同様でしょう。
(もしコネクションプーリングをセッションで管理、ならそれはやめましょう。)
我利
会議室デビュー日: 2006/09/15
投稿数: 7
投稿日時: 2006-09-19 01:28
tetoさん
ありがとうございます

http://hp.vector.co.jp/authors/VA000137/tomcat-session-timeout-bug.html
を参考にやってみたのですが、どうしてもリクエストが上がった時点からカウントされるようになりません。これは間違っているのですか!?
我利
会議室デビュー日: 2006/09/15
投稿数: 7
投稿日時: 2006-09-19 01:33
暁さん
ありがとうございます

引用:
--------------------------------------------------------------------------------

記述されている現象はセッションタイムアウトが発生すると必ず発生しますよね。
発生させないためにはタイムアウトを起こさせないということですが、ありえません。運用上。

--------------------------------------------------------------------------------
タイムアウトは起こっていいのですが、起こるタイミングの問題です。
リクエストが上がった時点から、セッションタイムがカウントされるようになれば、今回の現象は解決されると考えております。

ほーち
会議室デビュー日: 2005/12/10
投稿数: 19
お住まい・勤務地: 石川県
投稿日時: 2006-09-19 20:56
返答ではなく、便乗を。。

参照ページの修正対象↓が、なぜ駄目なのかわかりません。

int timeIdle = (int) ((timeNow - lastAccessedTime) / 1000L);

本当のバグのようですが、前回アクセス時刻から今回アクセス時刻までの間に経過した時間がタイムアウト時間を過ぎていたらセッションが切れる、というのは理屈に合わないのですか???

修正後のコード↓だと、0に近い数字になって、タイムアウトにならないのではないでしょうか???(現在時刻−今回アクセス時間≒0???)

int timeIdle = (int) ((timeNow - thisAccessedTime) / 1000L);

[ メッセージ編集済み 編集者: ほーち 編集日時 2006-09-19 20:58 ]

スキルアップ/キャリアアップ(JOB@IT)