- PR -

セッションが切れたときのsubmit処理で

投稿者投稿内容
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-10-27 15:16
いつもお世話になっております。
JavaScriptでsubmit処理を行うところがあるのですが、サーバとのセッションが切れた場合に
submit処理が利かない現象についてお知恵をお借りしたいと思います。
開発環境:
Tomcat 4.1.24
Struts1.1
Win2K SP4
IE6.0 SP1

JSPの大まかな処理といたしましては、以下のようになっています。

function endPage() {
  if(flg == true){
document.logoffActionForm.submit();
}
}
<body bgcolor="#fafaf0" onunload="return endPage()">
<center>
<br>
<font color="#ff0000" size="2" class="size12px">
</font>
<br>
<br>
<html:form action="/logoff">
<html:image src="images/btn_logoff.gif" onclick=""/>

</html:form>
</body>

submit処理を行うと、画面がリロードされる為、onunloadが走ります。
そのため、flgで判別してsubmitを2度しないように記述しています。

そのとき、sessionが切れていた場合にブラウザの右上のXボタンなどを押して終了させる
ときに、endPageのsubmitが利かず、本来の処理が走りません。
これは、何が原因なのでしょうか?
ためしに、
document.location="http://localhost:8080/xxx/logoff.do?〜以下引数〜;
と記述してみたのですが、処理が走りませんでした(これは、セッションが切れていなくてもダメでしたが・・・・)。

以上、どなたかご教授のほどよろしくお願いいたします。
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-10-27 15:16
追記です。
Tomcatのconfフォルダ内に有るweb.xmlのセッション切れ間での設定を下記のようにしてあります(テスト用として)
<session-config>
<session-timeout>1</session-timeout>
</session-config>
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-10-27 16:33
ご質問の意図がいまいち汲み取れないのですが、
「ウィンドウを閉じたときに onunload の処理が呼ばれない」ことについてのご質問でしょうか?

それとも「セッションが切れていると期待している Action が呼ばれない」ことについての質問でしょうか?
おそらく後者だと思うのですが、まずはブラウザが適切にリクエストを投げているか確認するためにアクセスログやパケットキャプチャで確認してみてはいかがでしょうか?
ブラウザがリクエストを送信しているのに、期待する Action が呼ばれないのであれば Filter や ActionServlet または Action クラスの親クラスなどでセッションが持続していないと "loggoff" アクションが呼ばれないようなコードが記述されていませんか?

また、二重submit 防止処理として、Struts の Token を使うのではだめでしょうか?
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-10-27 16:55
インギさん、レスありがとございます。
質問が下手で申し訳ありません。
「セッションが切れていると期待している Action が呼ばれない」が本来の質問の内容です。

ログ等はすでに確認済みで、全く処理が走っていません。

親クラスなどはチェックしていないので、確認してみます。

Tokenに関しては検討してみたのですが、今回はあまり時間が取れない為JavaScriptにフラグを持たせて回避しています(一番手軽に行えたので)。

また後程、ご報告いたします。
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-10-27 17:22
すいません。書き忘れていましたが、画像(imageタグ)を押下したときには、
処理が走ります。
わんこ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 46
投稿日時: 2003-10-27 17:59
私はC'zkaさんの書き込まれた内容について、
×ボタンを押しているからactionが呼ばれないのだと思います。

×ボタン以外でonUnloadの処理はできるんですよね?

私も同じようなことを試したことがあります。
ブラウザを閉じてしまうと、ブラウザからリクエストを送信することができない?
のでダメなのだと思います。
この辺り、未熟でうまくお話しできないのですが、
ブラウザ上でsubmitしてそのsubmitしたブラウザを閉じてしまうからだと思います。

うまく説明できないのですが
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-10-27 18:15
わんこさん、レスありがとうございます。

セッションが切れていない場合(切れても数分は)、Xボタンを押しても
onunloadの処理でSubmitが走ります。
実際には、この画面から立ち上げたブラウザ等を落とす処理もあるのですが、そちらは
ちゃんと行われています。
あくまで、Submit処理を通過しているにもかかわらず送信されないことです。

タイムアウトを1分にして10分ほど放置しXボタンを押したら、やはりパケットは一切
吐かれていませんでした。
3分ほど放置した場合は、正常処理が行われているようです(セッションの値はなくなっているが、ActionFormBeanに値はセットされたので、処理は問題なく終了した)。

また、原因を探してきます・・・・・
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-10-27 18:37
セッション時間を初期値(30分)に戻して、適当に置いておいた後(7分ぐらい)
Xボタンを押したら、docment.form[0].submit()が飛びませんでした・・・
セッション云々は、どうやらこちらの勘違いのようです。

しかし、特に処理を行わないのに時間で突然効かなくなるようなことがあるのでしょうか?

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