お世話になっています。
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
よろしくお願いいたします。
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
とてもわかりやすいご回答ありがとうございました。参考URLも役に立ちそうです。
思っていたよりも奥が深そうなので、今回はrequestで回して解決することにします。
これを機会にちょっと勉強してみようと思います。ありがとうございました。
No.3
- 回答日時:
あまり参考にならないかもしれませんが、以前、tomcat@localhost/jspの構成で、Cookieでセッション管理をしている場合に、ブラウザのクッキーを無効にしてもセッションが保持されるという現象に遭遇しました。
このときは、localhost以外のホストからアクセスした場合は、セッションが(予想通り)保持されないことがわかりました。
ひょっとしたら、これがテスト環境と本番環境で挙動が違う原因かも?と思い、一応書き込んでみました。
役に立てなかったらすみません。
あー、なるほど!
そういうことですね。それはありそうです。
かなり以前にも、同様の現象に遭遇したことがありました。
そのときはrequestで振り回して回避したのですが、そういうことなら納得がいきます。
とても参考になりました。ありがとうございました。
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を使ったセッション管理をしない設定ならブラウザは関係がなくなります。
この回答への補足
ご回答ありがとうございました。
非常に勉強になります。
JSPについて完全に誤解していたことが分かりました。
私の今までの考えですと、ブラウザからのリクエストがHTTPServletRequestに格納されて、そこに入っているセッションIDがHTTPServetResponseオブジェクト(のどこか)に(自動的に)格納されてブラウザに返り、次のリクエストでまた同じセッションIDが送られてきて……というように、ブラウザを閉じない限りセッションIDは同一のものが使われるのだと思っていました。
そうではない、ということですね?
そんなわけですので、セッション管理は明示的にはしていませんでした。そういうことをする必要があるということすら考えていませんでしたので。。。
> たとえば、そもそもTomcatがCookieを使ったセッション管理をしない設定ならブラウザは関係がなくなります。
これはつまり、可能性として
・テスト環境のTomcatは、クッキーを使ったセッション管理を自動的にしてくれるので、今まで動作していた。
・本番環境のTomcatではそういう設定になっていないため、明示的にセッション管理をしないと、その都度セッションが切れてしまう
ということが原因という可能性がある、というように考えていいのでしょうか。
またしても質問になってしまって申し訳ありません。
よろしくお願いいたします。
No.1
- 回答日時:
こんにちわ。
セッションIDの引継ぎは、URLか、Cookieで行われます。
どちらを使用されているかによって、調べるポイントは変わってくるとは思いますが、その周辺を疑ってみたらどうでしょうか。
Cookieによるセッション管理方式なら、ブラウザの設定を見るとか、Cookieヘッダが確かに受け渡されているか、プロトコルヘッダを覗いてみるとか。
この回答への補足
ありがとうございます。
テスト環境と本番環境では同じブラウザを使用しているのでクッキーが原因と言うことは考えにくいんじゃないかと考えています。
あと、URLなのですが、
・postで送っていること
・JSPのsessionスコープを使っていること
から、URLの引き継ぎは不要ではないかと考えていたのですが、そんなことはないのでしょうか。
私は、JSPのsessionはその辺を隠蔽して自動的にやってくれるものだとばかり思っていたのですが。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グローバルIPアドレスの変更タ...
-
sessionスコープとapplication...
-
ASP Session変数名の取得
-
リッチクライアントのセッション
-
MySQL・Tomcat・JSP 何度もSub...
-
setAttribute getAttribute 配...
-
JSPでsession変数が勝手に書き...
-
javascriptでセッションを取得
-
JSPで、sessionのタイムアウト...
-
ボタンが活性化の場合とは、ボ...
-
フォーム上で押されたボタンに...
-
C言語で今まで表示していた画面...
-
リクエストに応じたselectedの...
-
フォームで同じ複数のnameで違...
-
VB.NET DataReaderが開かれている
-
jspからServletを呼び、元のjsp...
-
VC++にて、コンソールを二画面表示
-
動的に作成したラジオボタンの...
-
CGI(Perl)のメッセージボックス...
-
ActiveWorkbook.Pathの一つ下の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javascriptでセッションを取得
-
グローバルIPアドレスの変更タ...
-
setAttribute getAttribute 配...
-
エラーページ遷移後に入力値を残す
-
JSPでsession変数が勝手に書き...
-
ASP.NETのGlobal.asaxについて
-
MySQL・Tomcat・JSP 何度もSub...
-
aタグによる複数リンクを別セッ...
-
javascriptでセッションの削除...
-
セッションIDの桁数
-
sessionスコープとapplication...
-
GoogleChrome閉じるたびにアン...
-
jsessionidの有効期限を延長す...
-
HTMLのSELECTタグの使い方、JSP...
-
ターミナルサービスでクライア...
-
ASP Session変数名の取得
-
ブラウザバック禁止
-
セッション維持について
-
カスタムタグを使用してリクエ...
-
セッションの情報の消去について
おすすめ情報