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

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

Sessionが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になっていないのでしょうか?

  • Java
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • セッション管理

    度々の質問で申し訳ないです…。 「セッション管理」がどうしてもよく分かりません。 書籍やWeb上でいろんな説明を読んで頭では理解したつもりなんですが 実際使う段になるとつまづいてしまいます。 そこで質問です。 html → Servlret1 → JSP1 → Servlet1 → JSP2 → JSP3 このような遷移の中でセッション管理を行いたいと思っています。 今、JSP2までは無事にセッションオブジェクトに保存されたデータを 参照することができていますが、JSP2からJSP3に移るときに nullが渡されてしまうのです。 一度、Servlet1 へ制御を戻さなければだめなのでしょうか? 具体的なコードを以下に掲載します。 よろしくお願いします。 ========= Servlet1 でセッション開始 //セッションを得る HttpSession thisSession = req.getSession(true); //セッションに保存 req.getSession(false).setAttribute("Login","true"); ========= JSP2 で受け取る /* ここではちゃんと"true"が返ってきます。 */ //セッションオブジェクトから取り出す String login = (String)request.getSession(false).getAttribute("Login"); ========= JSP3 で受け取る /* ここで null が帰ってきてしまいます。 String login = (String)request.getSession(false).getAttribute("Login");

  • セッションIDの付け替えについて

    はじめまして。 Servlet でセッションIDの付け替えをしたいのですが、 HttpSession session = request.getSession(); out.println(session.getId()); session.invalidate(); HttpSession newSession = request.getSession(true); out.println(newSession.getId()); のように、 一度invalidate()してから、 新しいセッションを取得しても 同じセッションIDとなってしまいます。 違うセッションIDを振るにはどうしたらよいでしょうか。

  • セッションについて(修正版)

    セッションが切れている状態でrequest.getSession(false)を行なった場合、戻り値はnullにはならないのでしょうか? セッションの中身がカラになるだけで、セッション自体は 存在するのでしょうか?

    • ベストアンサー
    • Java
  • Javaでのセッションについて

    質問があります。 ServletでSessionを用いるときににまず初めに、 /*セッションの開始*/ HttpSession session = req.getSession(); というふうにすると思います。 ここで、HttpServletRequestのメソッドとしgetSessionがあるわけですが、 セッションというのはリクエストから受け取り開始するものなのですか? 私の解釈では、リクエスト→セッション→コンテキストという順番でスコープが広くなっていると認識しています。 なのになぜ、リクエストからセッションを受け取るのかが疑問でなりません。 また、ブラウザで×ボタンを押すとセッションは終了すると思いますが、 この時にもし、セッション上に明示的に解放しなければならないBeanなどをあげていた場合、 どうやって解放してあげればいいのでしょうか。 たぶん、大きな勘違いをしていると思うのですが、 どなたかご教授願いますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaサーブレット sessionの使い方

    sessionを使ってデータの受け渡しをしたいのですが、ページ移動が増えると上手く受け渡せ無くて困っています。 jsp→Servlet のみでテストした時は正常に動いたのですが、ページを増やすと値が上手く更新されないのです。 下のプログラムではjspでセッションを開始して、ボタンを押すことでNS1.javaに移動し値を1増やしてNS2.javaに移動します。NS2.javaでも値を1増やしているので結果的に2つ値が増えるはずなのに1つも増えません。 何が悪いのでしょうか。解決策を教えて下さい。 // NStest.jsp <%@ page contentType="text/html;charset=Windows-31J" %> <html> <head> <title>移動</title> </head> <body> <% // isNewメソッドでセッション管理されているか確認します。 if (session.isNew()) { // セッション管理されていない場合、データを登録します。 session.setAttribute("count", 0); // 初回用メッセージ out.println(" Nice to meet you."); } else { // セッション管理されている場合、データを表示します。 out.println("count: " + session.getAttribute("count")); } %> <form method="POST" enctype="multipart/form-data" action="NS1"> <INPUT type="SUBMIT" name="button1" value="移動"> </form> </body> </html> // NS1.java package NStest; import java.io.*; import javax.servlet.*; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class NS1 extends HttpServlet { public void doPost (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 出力形式等の設定 ServletContext context = this.getServletContext(); response.setContentType("text/html;charset=Windows-31J"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(false); String message; if (null == session) { // nullが返ってくる場合はセッションが作成されていない session.setAttribute("count", 0); out.println("セッションが開始されていません。"); } else { // セッションインスタンスからcountの値を取得して表示 // 1加算してふたたび保存 Integer count = (Integer)session.getAttribute("count"); session.setAttribute("count", 1 + count.intValue()); message = "ページカウント: " + count; out.println(message); } // 処理後はNS2.javaにリダイレクト response.sendRedirect("NS2.java"); } } // NS2.java package NStest; import java.io.*; import javax.servlet.*; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class NS2 extends HttpServlet { public void doPost (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 出力形式等の設定 ServletContext context = this.getServletContext(); response.setContentType("text/html;charset=Windows-31J"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(false); String message; if (null == session) { // nullが返ってくる場合はセッションが作成されていない session.setAttribute("count", 0); out.println("セッションが開始されていません。"); } else { // セッションインスタンスからcountの値を取得して表示 // 1加算してふたたび保存 Integer count = (Integer)session.getAttribute("count"); session.setAttribute("count", 1 + count.intValue()); message = "ページカウント: " + count; out.println(message); } } }

    • ベストアンサー
    • Java
  • サーブレットのsessionについて…。

    お世話になります。 サーブレットでリクエストを受付け、JSPで表示させたいのですが サーブレットでファイルの読み込みだけをsessionにし一覧表示や 検索結果はrequestで処理したいのですがsessionにしたものを requestで受け取る事ってできますか? 今はsessionで受け渡しもしてるので一覧表示や検索結果が残って しまい上手く表示できません…。 初心者なので説明不足も多々あるとは思いますが宜しくご教授 お願いします。 捕捉要求下されば書き込みます。

    • ベストアンサー
    • Java
  • Servlet-JSP のセッション管理

    すいません。 セッションというものを使ってみたいなと思い、 本などを、見よう見真似で下のようなものを作ってみましたが、 まったく動きません。どこがいけませんか? ーーservlet-ー HttpSession session = req.getSession(); if (session.isNew()) {  session.setAttribute("test","ssm3u"); } ーーforwardされるJSP-ー <% HttpSession session = request.getSession(); %> <%= (String)session.getAttribute("test"); %> "ssm3u"と出したいのですが、全然違うのでしょうか? 自分ではCookieを利用するセッション管理を作ったつもりです・・

    • ベストアンサー
    • Java
  • javaservletの質問

    package test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet(urlPatterns={"/test/Test2"}) public class Test2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); // セッションを取得(新しいセッションを作成しないようにする) if (session != null) { response.getWriter().write("yes, World!"); // クライアントにテキストを出力 } else { response.getWriter().write("no, World!"); // クライアントにテキストを出力 } } }sessionがある場合にはyesを、無い場合にはnoを出力したいのですが必ずyesになってしまいます。 HttpSession session = request.getSession(false); でsessionがない場合には作成しないようにしているはずなのになぜでしょうか

  • Sessionについて

    今、JSPを用いてログイン画面を作成しているのですが、Sessionの使い方がいまいちわかりません。 HttpSession ses = request.getSession(); ses.setAttribute("id",id); これでSessionに格納するのはわかりますが Sessionから値を取り出す方法がわかりません。 どなたか助けてください

    • ベストアンサー
    • Java
  • セッションが切れないのは何故?

    画面にログインして操作中、セッションが切れた場合にまたログイン画面を表示するという処理のテストをしています。 タイムアウトまでの時間が24分となっていたので、画面にログインした状態でPCに触らず放置していました。 30分程度放置した後に次の処理に移るためのsubmitボタンをクリックしたところ、セッションは切れず処理が続行されてしまいました。 何故セッションは切れなかったのでしょうか? タイムアウトさせるには何か特別な処理を行わなければいけないのでしょうか? アドバイスをお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう