プロが教えるわが家の防犯対策術!

お世話になっています。
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

 よろしくお願いいたします。

A 回答 (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
    • good
    • 2
この回答へのお礼

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

お礼日時:2009/03/06 11:32

あまり参考にならないかもしれませんが、以前、tomcat@localhost/jspの構成で、Cookieでセッション管理をしている場合に、ブラウザのクッキーを無効にしてもセッションが保持されるという現象に遭遇しました。


このときは、localhost以外のホストからアクセスした場合は、セッションが(予想通り)保持されないことがわかりました。
ひょっとしたら、これがテスト環境と本番環境で挙動が違う原因かも?と思い、一応書き込んでみました。

役に立てなかったらすみません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/04 01:17

すいません一つ誤解を招く表現してました。


「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ではそういう設定になっていないため、明示的にセッション管理をしないと、その都度セッションが切れてしまう

ということが原因という可能性がある、というように考えていいのでしょうか。

またしても質問になってしまって申し訳ありません。
よろしくお願いいたします。

補足日時:2009/03/04 00:09
    • good
    • 1

こんにちわ。



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

この回答への補足

ありがとうございます。

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

補足日時:2009/03/03 11:29
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!