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