Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

セッションタイムアウトに

Tomcat5.5.20

session管理をしているのですが、セッションタイムアウト時にエラー画面に遷移させたいと思っているのですが、HttpSessionListenerにてタイムアウトのイベントを拾っているのですが、HttpSessionEventしか引数がないので、どうやったらエラー画面に遷移できるか悩んでおります。

アドバイスをいただけたら幸いです。
すいませんが、宜しくお願い致します。

5

回答

83485

閲覧

5件の回答

評価

0

セッションタイムアウトになると同時に、ブラウザの画面を移動させることはできません。
これはWebの仕組み上、どうしようもないです。

AJAXの変形であるCometを使ってリクエストを捕まえておいて、セッションタイムアウト時にレスポンスを返すようにしてあげればできるような気もしますが、AJAXを含めたクライアント側の実装の知識も必要になりますね。

評価

0

mio様、返信ありがとうございます。

セッションタイムアウトと同時には無理なのですね。

HttpServletResponse#sendErrorとかを使ってもやっぱり駄目ですか?

セッションタイムアウト時の処理の定石をご教授いただけないでしょうか?

評価

30

キャッチボールを想像してください。
ボールははじめに、ブラウザが持っています。
ブラウザが、「僕とキャッチボールしてくれ」とボールを投げ、サーバが相手を認知(認証)した上で、ボールを投げ返します。
ブラウザがボールをサーバへ投げるのがリクエストです。
サーバがボールをブラウザへ投げ返すのがレスポンスです。
次にいつ、ブラウザからボールが投げられるかは分かりません。ユーザの意思次第です。

セッションタイムアウトというのは、長らくブラウザからボールが投げられず、サーバが「もうキャッチボールしないんだな」と、相手を忘れることにした状態と考えてください。
そうすると、サーバには投げ返すボールがありません。

たいていの場合、セッションタイムアウト時に特別な処理は必要ないです。
セッションに保持していたデータは、tomcatが勝手に破棄します。
ボールが来たときにタイムアウトしていたら、「お前なんか知らん」とエラー画面に遷移させるか、「身元を知らせてくれ」と投げ返すのが普通です。

評価

0

Webアプリでのサーバーとクライアントのやり取りは
クライアント(ブラウザ)がサーバーへリクエストを出し
サーバーはそのリクエストに対してクライアントへレスポンスを返して1回のやり取りが終わりです

サーバーからやり取りが始まることはないです
つまり「HttpSessionListenerにてタイムアウトのイベントを拾って・・」とかしてもクライアントに送ることはできないということです
(特殊な仕組みでできたりというりは除く
求めているものが違うと思うし)

サーバーがクライアントからのリクエストを受け取って処理を始めた際に
セッションから情報を取り出そうとして取り出せれば通常の処理を行い、正常時のレスポンスを返し(処理結果の画面を出し)
タイムアウトが発生していれば取り出せないのですから、他のエラーが出たときとかと同様にエラー時のレスポンスを返す(タイムアウトが発生したなりのエラー画面を出すとか)ようにすればいいんじゃないでしょうか

要は送られてきたフォームデータとかをチェックして、あやまりがあればエラー画面を出したりするのと同様に
セッションデータが取り出せるかチェックして、取り出せなければエラー画面を出せばいいと思いますけど

評価

0

サーブレットとか使っているのであれば
ログイン時に何かキーになるものをsessionに
保存しておき各サーブレットの処理前にいつ
もそれを呼んでOKだったら次の処理
だめだったらエラーページにフォーワード
するなどしたら同でしょうか?

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。