• ベストアンサー

JSPでsession変数が勝手に書き換えられる

お世話になっています。 JSPを使ってプログラミングをしていますが、画面遷移の途中でsession変数の内容が空になってしまう現象に悩まされています。 画面遷移は、 ■入力画面 <jsp:useBean id="apply" scope="session" class="apply.Apply2009Bean" /> ↓post ■確認画面(ここで、前の画面で入力された値をsessionに保存) <jsp:useBean id="apply" scope="session" class="apply.Apply2009Bean" /> ↓post ■申し込み完了画面(入力された値をDBに保存) <jsp:useBean id="apply" scope="session" class="apply.Apply2009Bean" /> ここで、申し込み完了画面になるとapplyという変数の中が全部nullになっています。 念のため暗黙のsession変数からgetId()でセッションIDを画面に出してみると<%=session.getId()%> 申し込み画面:585C94623773F49C0708E050C95E20D2 確認画面:5C35DCF1B68850A762D531CAF2F9700E 完了画面:7D1035FD035C7767C8CEB1D938325D60 と、毎回セッションIDが変わっています。  ちなみに、テスト環境ではこの問題は起こらず、本番環境のみで発生します。  同様の問題を経験したことがあるかたはいらっしゃいませんでしょうか。 構成は ■テスト環境: os:WindowsXP SP2 server:Tomcat 4.1 Java: 1.4.2 ■本番環境: os:FreeBSD 6.1-RELEASE-p6 server:Tomcat 4.1 Java: 1.4.2  よろしくお願いいたします。

  • annyG
  • お礼率70% (67/95)
  • Java
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • ecogilis
  • ベストアンサー率60% (12/20)
回答No.4

>私の今までの考えですと、ブラウザからのリクエストがHTTPServletRequestに格納されて、そこに入っているセッションIDがHTTPServetResponseオブジェクト(のどこか)に(自動的に)格納されてブラウザに返り、次のリクエストでまた同じセッションIDが送られてきて……というように、ブラウザを閉じない限りセッションIDは同一のものが使われるのだと思っていました。 >そうではない、ということですね?  そうですね。  時には手動でセッションIDをレスポンス内に明示する必要があります。  そうしないと、その後のアクセスでブラウザはセッションIDを返さないので、Tomcatは新しいセッションIDを再発行する事になります。 > たとえば、そもそもTomcatがCookieを使ったセッション管理をしない設定ならブラウザは関係がなくなります。 >これはつまり、可能性として >・テスト環境のTomcatは、クッキーを使ったセッション管理を自動的にしてくれるので、今まで動作していた。 >・本番環境のTomcatではそういう設定になっていないため、明示的にセッション管理をしないと、その都度セッションが切れてしまう >ということが原因という可能性がある、というように考えていいのでしょうか。  そうです。  ちなみに、Contextに、cookies="false"という属性がセットされているならクッキーによるセッション管理は無効化されています。  あと面白いページを見つけました。  こんな問題もあるんですね。参考URLに乗せておきます。  考慮すべき点が色々あって難しいです。  

参考URL:
http://blog.utils.jp/2008/06/tomcat.html
annyG
質問者

お礼

とてもわかりやすいご回答ありがとうございました。参考URLも役に立ちそうです。 思っていたよりも奥が深そうなので、今回はrequestで回して解決することにします。 これを機会にちょっと勉強してみようと思います。ありがとうございました。

その他の回答 (3)

  • foxa-gogo
  • ベストアンサー率44% (38/85)
回答No.3

あまり参考にならないかもしれませんが、以前、tomcat@localhost/jspの構成で、Cookieでセッション管理をしている場合に、ブラウザのクッキーを無効にしてもセッションが保持されるという現象に遭遇しました。 このときは、localhost以外のホストからアクセスした場合は、セッションが(予想通り)保持されないことがわかりました。 ひょっとしたら、これがテスト環境と本番環境で挙動が違う原因かも?と思い、一応書き込んでみました。 役に立てなかったらすみません。

annyG
質問者

お礼

あー、なるほど! そういうことですね。それはありそうです。 かなり以前にも、同様の現象に遭遇したことがありました。 そのときはrequestで振り回して回避したのですが、そういうことなら納得がいきます。 とても参考になりました。ありがとうございました。

  • ecogilis
  • ベストアンサー率60% (12/20)
回答No.2

すいません一つ誤解を招く表現してました。 「URL」は正確には、「URLへのセッションID埋め込み」です。 >テスト環境と本番環境では同じブラウザを使用しているのでクッキーが原因と言うことは考えにくいんじゃないかと考えています。 >あと、URLなのですが、 >・postで送っていること >・JSPのsessionスコープを使っていること >から、URLの引き継ぎは不要ではないかと考えていたのですが、そんなことはないのでしょうか。 >私は、JSPのsessionはその辺を隠蔽して自動的にやってくれるものだとばかり思っていたのですが。。。 その前に、セッションの管理はそもそもどちらの方式で行おうとしているんでしょうか。 Cookieなんでしょうか、URL埋め込みによる方式なんでしょうか? それによって、調査ポイントは異なってくるし、調査の効率も異なってくると思います。 仮に、URL埋め込みに方式だとして(今回は違う気もしますが)、、、JSPはCookie、URLどちらでも利用できるようになっていますが、Cookieで引き継ぐ場合はともかく、URLにセッションID埋め込みをする場合には、自力で埋め込みをする必要があります。 FormのGETであれPOSTであれ、Aタグであれ自動的なセッションID埋め込みは行われません。 もちろん自動でURLへのセッションパラメータを埋め込んでくれるような便利なタグライブラリを使っているなら話は別です。 このURLに対するセッションID自動埋め込みが行われない理由は知りませんけれども、HTML内のURLに対して自動設定するためには、JavaScriptで動的生成されるURLも考慮する必要があったりして、恐らく自動的な完全なサポートは無理ですので、それが理由なんじゃないかなと想像します。 >・JSPのsessionスコープを使っていること スコープは変数が保持されているエリアを指定するだけのものです。そして今回の問題は、セッションが継続しないことが問題です。 なので、指定されているからどうということでもないんです。 仮に、Cookieだとして、、、 Cookieもサイトによって、許可する拒否する指定ができるブラウザがあったりもするので、ブラウザが同じというのはこれが問題ないということにはならないと思います。 それに、ブラウザが問題なくてもTomcat側が問題かもしれないです。 たとえば、そもそもTomcatがCookieを使ったセッション管理をしない設定ならブラウザは関係がなくなります。

annyG
質問者

補足

ご回答ありがとうございました。 非常に勉強になります。 JSPについて完全に誤解していたことが分かりました。 私の今までの考えですと、ブラウザからのリクエストがHTTPServletRequestに格納されて、そこに入っているセッションIDがHTTPServetResponseオブジェクト(のどこか)に(自動的に)格納されてブラウザに返り、次のリクエストでまた同じセッションIDが送られてきて……というように、ブラウザを閉じない限りセッションIDは同一のものが使われるのだと思っていました。 そうではない、ということですね? そんなわけですので、セッション管理は明示的にはしていませんでした。そういうことをする必要があるということすら考えていませんでしたので。。。 > たとえば、そもそもTomcatがCookieを使ったセッション管理をしない設定ならブラウザは関係がなくなります。 これはつまり、可能性として ・テスト環境のTomcatは、クッキーを使ったセッション管理を自動的にしてくれるので、今まで動作していた。 ・本番環境のTomcatではそういう設定になっていないため、明示的にセッション管理をしないと、その都度セッションが切れてしまう ということが原因という可能性がある、というように考えていいのでしょうか。 またしても質問になってしまって申し訳ありません。 よろしくお願いいたします。

  • ecogilis
  • ベストアンサー率60% (12/20)
回答No.1

こんにちわ。 セッションIDの引継ぎは、URLか、Cookieで行われます。 どちらを使用されているかによって、調べるポイントは変わってくるとは思いますが、その周辺を疑ってみたらどうでしょうか。 Cookieによるセッション管理方式なら、ブラウザの設定を見るとか、Cookieヘッダが確かに受け渡されているか、プロトコルヘッダを覗いてみるとか。

annyG
質問者

補足

ありがとうございます。 テスト環境と本番環境では同じブラウザを使用しているのでクッキーが原因と言うことは考えにくいんじゃないかと考えています。 あと、URLなのですが、 ・postで送っていること ・JSPのsessionスコープを使っていること から、URLの引き継ぎは不要ではないかと考えていたのですが、そんなことはないのでしょうか。 私は、JSPのsessionはその辺を隠蔽して自動的にやってくれるものだとばかり思っていたのですが。。。

関連するQ&A

  • JSPで、sessionのタイムアウトを制御したいのですが・・・

    じつはかなり素人なのですが、JSPで、冒頭のほうに、例えば <jsp:useBean id="db" class="db*****.db*****bean" scope="session"/> と記述したとします。で、このsessionのタイムアウトになる時間を制御したいのですが、どのようにしたらよいのかわかりません。 JAVAの記述で制御できる、ということは聞いたことがあるのですが・・・。 もしそれが難しければ、カウントをとって、「sessionタイムアウトまで **分前です」のようなアラートでも出そうかと思っていたのですが・・・。 どなたか、ぜひ教えてください。

  • JSPで、sessionのタイムアウトを制御したいのですが・・・

    じつはかなり素人なのですが、JSPで、冒頭のほうに、例えば <jsp:useBean id="db" class="db*****.db*****bean" scope="session"/> と記述したとします。で、このsessionのタイムアウトになる時間を制御したいのですが、どのようにしたらよいのかわかりません。 JAVAの記述で制御できる、ということは聞いたことがあるのですが・・・。 もしそれが難しければ、カウントをとって、「sessionタイムアウトまで **分前です」のようなアラートでも出そうかと思っていたのですが・・・。 どなたか、ぜひ教えてください。

  • JSPが表示できない

    サーブレットからJSPに表示させようとしているのですがJSPの中にJAVAソース を加えると表示できなく画面が真っ白になり、加えなければ表示できます。 原因がなぜなのかわからなく困惑中です。ソースは以下の通りです。 アドバイスお願いします。 <%@ page contentType="text/html;charset=Shift_JIS"                               import= "java.sql.*" %> <jsp:useBean id="Bean" class="Servlet"scope="session" /> <html> <head><title>表示画面</title></head> <body> // BeanファイルでデータをSQL文によって取り出しrs変数に格納し // getNameCDメソッドによってデータを取り出す。BeanファイルではSQL文 実行確認済み <% ResultSet rs = Bean.getNamaCD(); %> <%  while(rs.next()){ out.println(rs.getString(1)); // 名前のコードを取り出し表示させる。 } %> </body> </html>

  • MVCモデルのJSPの使い方

    こんにちは。二回目の質問をさせていただきます。 今MVCモデルとJDBCで、社員データをDBにいれる簡単なプログラムを作ろうとしているのですが、初期の段階で躓きました。 サーブレットにてBeanをSessionに関連付けているのですが、いざJSPにてBeanを使おうとするとエラーが出るのです。 JSPのコードは冒頭部分にきちんと下記のものを記述し、 (Beanクラス名はFileBeanです。サーブレットできちんとSessionで関連付けています) <jsp:useBean id="bean" class="FileBean" scope="session" /> JSPの中で、Beanのメソッドを使うようにしているのですが下記のようなエラーが出てしまいます。 org.apache.jasper.JasperException: JSPのクラスをコンパイルできません注: sun.tools.javac.Main は推奨されません。 JSPファイル: /Nyuryoku.jsp の中の行: 3でエラーが発生しました 生成されたサーブレットのエラーです: C:\Apache Tomcat 4.0\work\localhost\SyainData\Nyuryoku$jsp.java:65: クラス org.apache.jsp.FileBean が見つかりません。 FileBean bean = null; ^ 因みに参考書のもので試してみたところ、JSPにおいてBeanを使おうとすると空のHTMLが吐き出され、ブラウザには真っ白な画面が表示されます。JSPのBeanの部分を削除すると、ブラウザには普通にHTMLの部分が表示されるのです。 以上二つのことから、JSPでのBeanの使い方がおかしい、というのはわかったのですが、自分でどう解決して良いのかわかりません。特に参考書のコードはちゃんと市販されているものなので、問題ないと思うのですが… 最後になりましたが、私の環境は Tomcat4.0 で OSはMEになります。 皆様お忙しいとは思いますが、ご教示の程宜しくお願い致します<(_ _)>

    • ベストアンサー
    • Java
  • jsp から servlet に

    パラメータをJSPからServlet に渡す所で、どうしても、null になってしまします‥。 主要な部分だけ書きます。 --jsp-- <jsp:useBean id="beanId" class="Bean" scope="request" /> <form method="POST" action="servlet"> <input type="submit" value="送信"> <input type="text" size="10" name="name"> --servlet-- import Bean; Bean bean = (Bean)request.getAttribute( "beanId" ); // ↑ここが、nullになってしまう。 --Bean-- public String getName() { return name; } public void setName( String name ) { this.name = name; } 考え方が違ってるかも知れないのですが‥。 よろしくお願いします。

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

    プログラミング初心者です。サーブレットを勉強しています。 同じオブジェクトがセッション上で使い続けられず、困っています。 あるJSPファイル内で、 <jsp:useBean class="kajitu" id="kajitu" scope="session"/> という記述をし、そのファイル内で、 kajitu = db.load(1);//戻り値として、kajituオブジェクトが戻ってくる。戻ってくるkajituオブジェクトはdbクラス内で生成し、値を入れたものが返ってくる。 という記述をし、kajituオブジェクトに値をいれた(つもり)のですが、遷移して次のページにいくと、kajituオブジェクトは空(初期状態)になっています。kajituオブジェクトについて、何かいじっている処理は上の操作以外に特にありません。 上記の処理は、まずいやり方でしょうか? よろしくお願いします。

  • ServletとJSPで。。。

    省略してますが、下記の記述で JSPの----部分の記述方法がわかりません。 実際、実行できる環境だといいのですが、今は実行環境がないので調査できません。 まだなにもわからない状態なので、記述が正しいかも自信ありませんがよろしくお願いします。 =============Servlet==============================Schedulebean bean = new Schedulebean(); bean.setYear(request.getParameter("year")); bean.setMonth(request.getParameter("month")); request.setAttribute("bean", bean); request.getRequestDispatcher("/jsp/schedulefrm.jsp").forward(request,response); ============ JSP ================== <%@ page contentType = "text/html; charset=Shift_JIS"%> <jsp:useBean id="bean" scope="request" class="java.lang.String"/> <HTML> <FRAMESET FRAMESPACING="10" COLS="250,*"> <FRAME src="/jsp/calender.jsp?Year=<%= year % -------- ↑ >&Month=<%= month %>" --------- ↑    上記をid 取得する記述は? name = "left" scrolling = "no" NORESIZE /> <FRAME src="/jsp/schedule.jsp?Year=<%= year %>&Month=<%= month %>" name = "right" scrolling = "yes" /> </FRAMESET> </HTML>

    • ベストアンサー
    • Java
  • JSPでbeanプロパティ(配列)をgetしたい

    こんにちわ。 表題の件ですが、下のようなbeanファイルとjspファイルの構成です。 --AAA.JSP-- <jsp:useBean id="E" scope="page" class="myPack.Engine" /> ・・・・途中をかなり略・・・・ <td><%= E.getIntSuryo() %></td> <========(1) Engineクラス(bean側) package myPack; public class Engine { int intSuryo[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; } public int[] getIntSuryo() { return intSuryo; } --------------ここまで------------- ここで、(1)の箇所の記述の仕方がわかりません。 インデックスを指定して、1~10までを表にしようと思っています。 getIntSuryo()の括弧内にindexを入れてみましたが、 エラーとなり怒られました。 どなたかご存知の方、教えてください。

    • ベストアンサー
    • Java
  • JSP内で関数定義 EJB変数の参照

    いつもお世話になっています。 JSPの中に <%! ~ %> を使って、関数(function)を作ったのですが、それに、同JSPページ内で宣言したEJBがあるのですが、そのオブジェクトをfunction内で使おうとすると、宣言されていませんエラーが出てしまいます。JSPが内部でどのようなJavaとしてコンパイルされるかよく分からないのですが、 パラメータとして渡す以外に、functionの中でJSP内で宣言した、EJBを使うことは出来るのでしょうか。 ご存じの方が居ましたらよろしくお願いします。 記述例(こんな感じで使いたいです) <jsp:useBean id="testBean"      class="xxx.xxx.testBean"      scope="page">      <jsp:setProperty name="testBean"           property="testProperty"           value="test" /> </jsp:useBean> <%! private String testFunction(boolean booleanExpression) {      return(booleanExpression ? testBean.value() : " "); } %>

  • JSP jsp:usebean で総称型クラスを使うには

    お世話になります。 JSPでプログラムを書いています。 そこでjsp:usebeanを使っているのですが、そのクラスに以下のように総称型クラスを使用したいのです。 > <%@page import="java.util.Vector"%> > <jsp:useBean id="vec" scope="application" class="java.util.Vector<String>"/> で、warファイルまではできるのですが、実行するとブラウザ上に以下のようなエラーが表示されます。 > org.apache.jasper.JasperException: /index.jsp(4,0) useBeanのクラス属性 java.util.Vector<String> の値が無効です > org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40) > org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407) > org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148) > org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1178) JSPのbeanには総称型クラスを使うことができないのでしょうか。 環境は以下の通りです。 サーバー:Tomcat 5.5.27 jdk: 1.6.0_07 特別なコンパイルオプションなどは指定していません。 よろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう