- PR -

サーバリクエスト中のセッション維持方法

投稿者投稿内容
ニハト
会議室デビュー日: 2005/11/11
投稿数: 4
投稿日時: 2005-11-11 16:18
【現状】
下記システムを構築しています。(大まかですが)
DBサーバ
 |
APサーバ(jakarta-tomcat-4.1.30)
 |
Webサーバ(apache_2.0.49)

プログラム開発環境は下記です。
jave:j2sdk-1_4_2_05
フレームワーク:jakarta-struts-1.1

【問題点】
クライアントはブラウザ(IE5.5以降)でインターネットを経由してWebサーバにアクセスします。
このとき、検索処理をリクエストするのですが、
検索処理中に3分経過したとき、セッションタイムアウトが発生してしまいます。

・エンドユーザから接続した場合、3分無通信でタイムアウトになる。
・弊方から接続した場合3分無通信でもタイムアウトにならない。
この2点からAPサーバ、Webサーバのタイムアウト設定に起因するものでは無く、
客先のプロキシ(ファイアウォール)で切断されていると考えています。

【質問事項】
そこで、検索処理中にAPサーバからクライアントに対し、キープアライブのようなレスポンスを定期的に返すことで
セッションタイムアウトを回避できないかと検討しているのですが、良い解決策が見つからない状況です。
何か良い案がございましたらご教示頂けますでしょうか。
ハツキタツミ
大ベテラン
会議室デビュー日: 2005/05/24
投稿数: 108
投稿日時: 2005-11-11 16:28
引用:

ニハトさんの書き込み (2005-11-11 16:18) より:

そこで、検索処理中にAPサーバからクライアントに対し、キープアライブのようなレスポンスを定期的に返すことで
セッションタイムアウトを回避できないかと検討しているのですが、良い解決策が見つからない状況です。



こういうことって無理っぽい気がします。

httpの仕様云々とかあるんですが、私はあまり詳しくないので、
有識者の方々のフォローなんかいただけると...(^^;;

現実的な対応としては、”検索に3分もかけるな!”になるかと思うので、
DB検索を見直す(SQL等)、一度に結果を表示せず、ページャーなどで分けて表示する、
とかいった解決策が、より現実的な気がします。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-11-11 16:56
検索処理をいったん別スレッドにて行わせて、クライアントに対し定期的に終了をページリフレッシュなどを利用して終了を問い合わさせるのがいいと思います。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-11 18:04
セッションタイムアウトとはKeepAliveのコネクションが切断されることではなく、HttpSession のタイムアウトが発生しているという認識でよいでしょうか?
HttpSession はCookie や URL のパラメータで保持するものですのでファイアウォールやプロキシで切断されたり、タイムアウトが早まったりする性質のものではありません。
#特定のクッキーを削除したり、URL を書き換えたりする特殊なファイアウォールやプロキシがあるなら話は違ってきますが

web.xml のセッションタイムアウトの設定はどうなっていますか?
ニハト
会議室デビュー日: 2005/11/11
投稿数: 4
投稿日時: 2005-11-12 00:02
ご意見ありがとうございます。

検索処理中は、ブラウザ側は待ちになりますよね。
3分経過すると画面がタイムアウトの旨を表すエラー画面になるんです。
そのエラー画面を見ると、
「ISAサーバー(Internet Security & Acceleration Server)が
タイムアウトを検出しました。」
のような感じでメッセージが出てます。
 
だからプロキシで切断されてしまっているのではないかと思っています。
なお、Tomcatのタイムアウト設定はデフォルトの30分です。


山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-12 00:21
なるほど。
こんなの↓参考になるかもしれません。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7110&forum=12
ひら
ぬし
会議室デビュー日: 2005/03/04
投稿数: 260
投稿日時: 2005-11-12 01:08
引用:

ニハトさんの書き込み (2005-11-11 16:18) より:
そこで、検索処理中にAPサーバからクライアントに対し、キープアライブのようなレスポンスを定期的に返すことで


サーバからクライアントではなく、クライアントからサーバではいかがでしょう?
JavascriptのsetTimeoutを使い、一定時間ごとにサーバに送ります。
(どこかに書いたような気が…)

私の場合、フレームとダミーのページを用意し、フレームを上下に分け、上のフレーム
にダミーページ、下のフレームに本編のページを表示させています。そして、
ダミーのページの方にsetTimeoutを伴ったJavascriptを置いています。

xmlHttpRequestをうまく使うと、もっと綺麗にできるかもしれません。


ニハト
会議室デビュー日: 2005/11/11
投稿数: 4
投稿日時: 2005-11-12 09:49

サーバサイドだけでなく、クライアントサイドからでもできそうな気がしてきました。
JSPの修正だけでできればベターですね。
とりあえず、下記スクリプトをJSPに追加して検証することにします。
もしダメだったらマルチスレッド化ですね、難しそうだけど・・・
結果報告は月曜日になりそうですm(_ _)m

------------------------JSP------------------------
function keepSess(){
tID=setTimeout('keepSess2()',60000); ←サーバにリクエストする処理をタイマー起動
}

<BODY onLoad="keepSess()" onUnload="clearTimeout(tID)">

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