• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Sessionがnullになりません。)

Sessionがnullにならず、タイムアウト画面が表示される理由

このQ&Aのポイント
  • Webアプリケーションでのセッション管理において、画面Aから画面Bへの遷移後、一定時間何も操作せずに画面Bを表示しようとすると、タイムアウト画面が表示されることがある。この際、Sessionがnullになっていないにもかかわらず、タイムアウト画面が表示される理由は何か?
  • セッションのタイムアウト値は、web.xmlファイルのsession-timeout要素で指定される。この値が設定された時間経過すると、セッションがタイムアウトとして扱われ、タイムアウト画面に遷移する。
  • 画面Aで検索ボタンを押してもセッションがnullにならない理由は、Servletの処理でrequest.getSession(false)が呼ばれているためである。このメソッドはセッションが存在する場合にはセッションを返し、存在しない場合にはnullを返す。したがって、セッションが既に存在している場合にはnullにならず、セッション内の情報がnullになる可能性がある。

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

もう解決されているかもしれませんが、 (4)で表示されるタイムアウト画面ってJSPではないですか? <@ page session="false" %> の記述が無い場合、JSP表示時に暗黙的にsessionオブジェクトが作られます。 ですので、(5)では別IDのsessionになっているのではないでしょうか。 No.2の補足にある、(3)と(4)の手順を飛ばして (5)の操作(10分経過後に再度検索ボタンを押す)したらどうなりますか?

superss28
質問者

お礼

ご回答ありがとうございます。 >(4)で表示されるタイムアウト画面ってJSPではないですか? タイムアウト画面はJSPで作成しています。 ><@ page session="false" %> >の記述が無い場合、JSP表示時に暗黙的にsessionオブジェクトが作られます。 >ですので、(5)では別IDのsessionになっているのではないでしょうか。 記述はありませんでした。ここでsessionが生成されていたんですね…。 記述を追加したら(5)でsessionがnullになり、 画面Aもタイムアウト画面に遷移することができました。 >No.2の補足にある、(3)と(4)の手順を飛ばして >(5)の操作(10分経過後に再度検索ボタンを押す)したらどうなりますか? 直接(5)を行うと画面Aがタイムアウト画面になります。 タイムアウト画面は他の画面に遷移することはできず、 ウィンドウの×ボタンを押す以外、何もできないので特に問題ないと思っています。

その他の回答 (2)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

isNewで、新規に作成されたSessionかどうかを 確認してみてはどお? trueならそこに来るまでのどこかでgetSessionしているんだわ

superss28
質問者

お礼

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)
回答No.1

nullにならないのは その処理が呼ばれる前にどこかで getSessionしているところがあるんじゃない? フレームワークとか。

superss28
質問者

お礼

ご回答ありがとうございます。 Struts等のフレームワークは使っておらず、 Servlet-JspにWebアプリケーションです。 getSession(true)しない限りsessionは生成されないものと思っているんですが。。。

関連するQ&A