dポイントプレゼントキャンペーン実施中!

下記の環境でWebアプリケーションを開発しています。

java 1.5
eclipse 3.3
tomcat 5.5

ある画面Aは検索ボタンを押して結果一覧を表示したり、
結果一覧の詳細を知るためにリンクを押して、ポップアップ画面Bを表示したりします。

web.xmlに
<session-timeout>10</session-timeout>
と記述し、10分でタイムアウトとしています。
Servlet処理の最初で
request.getSession(false)
によりセッションを取得し、nullであればタイムアウト画面に遷移させています。

結果一覧を表示した後、10分間何もせずに画面Bを表示しようとすると
ポップアップの画面はタイムアウト画面で表示されます。
Servletにブレークポイントをつけて確認したところ
このときのrequest.getSession(false)の結果はnullでした。

タイムアウト画面を×ボタンで閉じ、A画面内で検索ボタンを押したところ、
request.getSession(false)の結果はnullではありませんでした。
ただし、session内にsetAttributeしていたBeanが全てnullになっており、
その後の処理で例外が発生してしまいました。

なぜ検索ボタンを押したところで
sessionがnullになっていないのでしょうか?

A 回答 (3件)

もう解決されているかもしれませんが、


(4)で表示されるタイムアウト画面ってJSPではないですか?
<@ page session="false" %>
の記述が無い場合、JSP表示時に暗黙的にsessionオブジェクトが作られます。
ですので、(5)では別IDのsessionになっているのではないでしょうか。

No.2の補足にある、(3)と(4)の手順を飛ばして
(5)の操作(10分経過後に再度検索ボタンを押す)したらどうなりますか?
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。

>(4)で表示されるタイムアウト画面ってJSPではないですか?
タイムアウト画面はJSPで作成しています。

><@ page session="false" %>
>の記述が無い場合、JSP表示時に暗黙的にsessionオブジェクトが作られます。
>ですので、(5)では別IDのsessionになっているのではないでしょうか。
記述はありませんでした。ここでsessionが生成されていたんですね…。
記述を追加したら(5)でsessionがnullになり、
画面Aもタイムアウト画面に遷移することができました。

>No.2の補足にある、(3)と(4)の手順を飛ばして
>(5)の操作(10分経過後に再度検索ボタンを押す)したらどうなりますか?
直接(5)を行うと画面Aがタイムアウト画面になります。
タイムアウト画面は他の画面に遷移することはできず、
ウィンドウの×ボタンを押す以外、何もできないので特に問題ないと思っています。

お礼日時:2010/12/23 08:39

isNewで、新規に作成されたSessionかどうかを


確認してみてはどお?
trueならそこに来るまでのどこかでgetSessionしているんだわ
    • good
    • 0
この回答へのお礼

isNewを入れてみたところ、falseでした。
ただし、セッションIDは別のものになっていました。
Servlet開始直後のgetSessionに続けて
isNewを入れた結果は以下の通りです。
((1)だけは別のServletで他は同じServletです)

(1)システム起動(request.getSession(true))
isNew→true

(2)検索(request.getSession(false))
isNew→false((1)と(2)のセッションIDは同じ)

(3)10分以内に画面B表示(request.getSession(false))
isNew→false((2)と(3)のセッションIDは同じ)

(4)10分以上何もせず画面B表示(request.getSession(false))
sessionがnullであるためisNewできず。

(5)検索(request.getSession(false))
isNew→false((3)までとセッションIDは異なる)

Servletの最後に遷移処理を実装しています。
RequestDispatcher dispatcher = context.getRequestDispatcher("JSP名称");
dispatcher.forward(request, response);
のような形です。
(4)はnull判定直後に上記処理でタイムアウト画面に遷移しています。

「ServletでセッションIDが異なる場合はタイムアウト画面に遷移させる」
という方法は"あり"なのでしょうか?
(jsp内のhidden項目でセッションIDを持たせ、session.getId()で取得したIDと比較)
試しにやってみましたが、(5)の時点で、
hidden → null
getId() → (3)とは別のID
でした。

お礼日時:2010/12/18 00:26

nullにならないのは


その処理が呼ばれる前にどこかで
getSessionしているところがあるんじゃない?
フレームワークとか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

Struts等のフレームワークは使っておらず、
Servlet-JspにWebアプリケーションです。

getSession(true)しない限りsessionは生成されないものと思っているんですが。。。

お礼日時:2010/12/16 23:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!