- ベストアンサー
Sessionがnullにならず、タイムアウト画面が表示される理由
- Webアプリケーションでのセッション管理において、画面Aから画面Bへの遷移後、一定時間何も操作せずに画面Bを表示しようとすると、タイムアウト画面が表示されることがある。この際、Sessionがnullになっていないにもかかわらず、タイムアウト画面が表示される理由は何か?
- セッションのタイムアウト値は、web.xmlファイルのsession-timeout要素で指定される。この値が設定された時間経過すると、セッションがタイムアウトとして扱われ、タイムアウト画面に遷移する。
- 画面Aで検索ボタンを押してもセッションがnullにならない理由は、Servletの処理でrequest.getSession(false)が呼ばれているためである。このメソッドはセッションが存在する場合にはセッションを返し、存在しない場合にはnullを返す。したがって、セッションが既に存在している場合にはnullにならず、セッション内の情報がnullになる可能性がある。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
もう解決されているかもしれませんが、 (4)で表示されるタイムアウト画面ってJSPではないですか? <@ page session="false" %> の記述が無い場合、JSP表示時に暗黙的にsessionオブジェクトが作られます。 ですので、(5)では別IDのsessionになっているのではないでしょうか。 No.2の補足にある、(3)と(4)の手順を飛ばして (5)の操作(10分経過後に再度検索ボタンを押す)したらどうなりますか?
その他の回答 (2)
- askaaska
- ベストアンサー率35% (1455/4149)
isNewで、新規に作成されたSessionかどうかを 確認してみてはどお? trueならそこに来るまでのどこかでgetSessionしているんだわ
お礼
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 でした。
- askaaska
- ベストアンサー率35% (1455/4149)
nullにならないのは その処理が呼ばれる前にどこかで getSessionしているところがあるんじゃない? フレームワークとか。
お礼
ご回答ありがとうございます。 Struts等のフレームワークは使っておらず、 Servlet-JspにWebアプリケーションです。 getSession(true)しない限りsessionは生成されないものと思っているんですが。。。
お礼
ご回答ありがとうございます。 >(4)で表示されるタイムアウト画面ってJSPではないですか? タイムアウト画面はJSPで作成しています。 ><@ page session="false" %> >の記述が無い場合、JSP表示時に暗黙的にsessionオブジェクトが作られます。 >ですので、(5)では別IDのsessionになっているのではないでしょうか。 記述はありませんでした。ここでsessionが生成されていたんですね…。 記述を追加したら(5)でsessionがnullになり、 画面Aもタイムアウト画面に遷移することができました。 >No.2の補足にある、(3)と(4)の手順を飛ばして >(5)の操作(10分経過後に再度検索ボタンを押す)したらどうなりますか? 直接(5)を行うと画面Aがタイムアウト画面になります。 タイムアウト画面は他の画面に遷移することはできず、 ウィンドウの×ボタンを押す以外、何もできないので特に問題ないと思っています。