- PR -

sessionとcookieについて

投稿者投稿内容
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2004-03-24 13:20
竹内と申します。本日はしめて投稿します。
JSPで sessionとcookieを作成しているのですが、他のページからsessionを照会できません。
次のようなサンプルで試しています。

String condition = "START-END";
Cookie cookie = new Cookie("condition",condition); // クッキーを作成
cookie.setMaxAge(7 * 24 * 60 * 60); // 有効期間を1週間に設定
response.addCookie(cookie); // クッキーを発行
session.setAttribute("condition",condition); // セッション情報の設定

最後の
session.setAttribute()
の後に、
session.getAttribute("condition").toString()
で情報を取り出すと、確かに "START-END"という文字列を検出するのですが、
別のページに飛ぶと、
session.getAttribute("condition")
は NULLになってしまいます。
ところが、サンプルの4行目を、
// response.addCookie(cookie); // クッキーを発行
のようにコメントにすると、sessionはちゃんと作成されるのです。
(他のページからsessionを照会できます)
  
1つのページでsessionとcookieを使用するには何か工夫が必要なのでしょうか?
宜しくお願いします。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2004-03-24 13:52
どもも、がると申します。
JSPとかそんなに詳しくはないのですが。

引用:

JSPで sessionとcookieを作成しているのですが、
他のページからsessionを照会できません。


んと、まず始めに。HTTPでのやり取りで「Cookie」はありますが、
「sesstion」というやり取りは存在しないです。
このあたりは、気合が持てばRFCとか読んでみるとよいです。
…いやまぁかなりしんどいですが :-P

で、sessionですが、HTTPでそういった実装が無い以上「なんらかの
手段を用いて」sessionを実装しているわけですが。
Javaの場合
・基本はCookie
という実装になっています。

つまり、sessionもHTTPの通信レベルで突き詰めると「Cookie」
になるわけです。
ということは、

引用:

String condition = "START-END";
Cookie cookie = new Cookie("condition",condition); // クッキーを作成
cookie.setMaxAge(7 * 24 * 60 * 60); // 有効期間を1週間に設定
response.addCookie(cookie); // クッキーを発行
session.setAttribute("condition",condition); // セッション情報の設定


において、conditionという名前が重複していることが
分かります。これだと、少なくとも「どちらかの情報がつぶされている」
ことになってしまいます。

とりあえず名前を変えてみるか、またはセッションを発行している
ならば、Cookieに設定している「ユーザ個別の情報」は、セッション
のIDをKeyにして「サーバ側で持っている」という類の設計
にしておいたほうがよいのかもしれません。

以下余談:
具体的にsessionで「どんなCookieを発行しているのか」の詳細が
調べ切れていないのですが(普段、自分は「自力で作成した」session
クラスを使っているので。どんな言語であれ)。

引用:

session.setAttribute()
session.getAttribute("condition").toString()
で情報を取り出すと、確かに "START-END"という文字列を検出するのですが、
別のページに飛ぶと、
session.getAttribute("condition")
は NULLになってしまいます。


でNULLになっているところを見ると、或いはsession用のCookieって、
識別用の指示子とか暗号化とか、なにか小細工をしているのかなぁ、
とか思ってみる今日この頃。
詳しい諸氏からの返答求む(笑

ちなみに「自作session Class」では概ね以下のロジックを使ってます。
コード:
セッションID = make_session_id();
乱数1 = 適当なランダムの文字列;
乱数2 = 適当なランダムの文字列;
基本文字列 = "a=乱数1&b=セッションID&c=乱数2";
key = 暗号化( 基本文字列 );


こんな感じで、CookieとかHiddenとかに埋め込むもkeyを作成しています。
ちなみに乱数1と2の長さは大抵の場合可変です(笑
アティ
ベテラン
会議室デビュー日: 2003/08/14
投稿数: 91
お住まい・勤務地: KANAGAWA
投稿日時: 2004-03-24 15:38
Tomcat等は、セッションIDをクッキーに保存しておいて、それをPOSTされる時に送ってもらい、
それを使用して、セッションの情報を取り出していたはずです。(他のアプリケーションサーバでも同じような実装だと思います。)
なので、クッキーとセッションで同じ名前で設定したからといって、重なることはないはずです。
(クッキーのセッションIDを保存する際のキーでなければ)
引用:

がるがるさんの書き込み (2004-03-24 13:52) より:
(省略)
引用:

String condition = "START-END";
Cookie cookie = new Cookie("condition",condition); // クッキーを作成
cookie.setMaxAge(7 * 24 * 60 * 60); // 有効期間を1週間に設定
response.addCookie(cookie); // クッキーを発行
session.setAttribute("condition",condition); // セッション情報の設定


において、conditionという名前が重複していることが
分かります。これだと、少なくとも「どちらかの情報がつぶされている」
ことになってしまいます。

とりあえず名前を変えてみるか、またはセッションを発行している
ならば、Cookieに設定している「ユーザ個別の情報」は、セッション
のIDをKeyにして「サーバ側で持っている」という類の設計
にしておいたほうがよいのかもしれません。

以下余談:
具体的にsessionで「どんなCookieを発行しているのか」の詳細が
調べ切れていないのですが(普段、自分は「自力で作成した」session
クラスを使っているので。どんな言語であれ)。

引用:

session.setAttribute()
session.getAttribute("condition").toString()
で情報を取り出すと、確かに "START-END"という文字列を検出するのですが、
別のページに飛ぶと、
session.getAttribute("condition")
は NULLになってしまいます。


でNULLになっているところを見ると、或いはsession用のCookieって、
識別用の指示子とか暗号化とか、なにか小細工をしているのかなぁ、
とか思ってみる今日この頃。
詳しい諸氏からの返答求む(笑


SJ0392
ベテラン
会議室デビュー日: 2004/02/05
投稿数: 62
お住まい・勤務地: 神奈川・横浜
投稿日時: 2004-03-24 20:31
使用しているServletコンテナが何か判らないのですが・・・・。

Jservの場合
コード:
HttpSession session = request.getSession(boolean);


を実行した時にコンテナ側で自動的にCookieを発行・取得してくれます。
JServSessionIdXXXX という名称で (XXXX は環境により変わります)。

この時、JServSessionIdXXXX に設定されているセッションIDを持った
HttpSession クラスがコンテナ内に生成、保持されます。
既に保持しているセッションIDだった場合は、保持している HttpSession クラス を取り出します。
取り出したクラスに格納している情報が存在していれば望みの情報が得られます。
(自分の認識で実際の動作とあっているか判りませんが)

なので Cookie に特に情報を持たせないのであれば Cookie を意識する必要はありません。

・念のための補足
Jserv の設定ファイルに cookie を有効・無効にする設定があるので有効にして下さい。
session.invalidate() でコンテナが保持している情報が削除されます。
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2004-03-25 11:50
みなさん、ご返答 本当にありがとうございます。
実は昨日(アティさんの書き込みの後に)一度書き込みをしたのですが、更新されていたかったのでもう一度書きます。

<がるがるさんへ>
> 「sesstion」というやり取りは存在しないです。
sesstionオブジェクトというのは、JSP独自のもののようです。
変換されたサーブレットをみると、HttpSessionという名前のオブジェクトでした。

<アティさんへ>
> Tomcat等は、セッションIDをクッキーに保存しておいて・・・
大きなヒントとなりました。これはクッキーに絡んだ問題のようです。
ちなみにコンテナにはTOMCATを使用しています。

実は本件とは別に悩んでおったのですが、
「1つのページでクッキーが1つしか保存できない」のです。

Cookie cookie;
cookie = new Cookie("condition1","ABCDEGF");
cookie.setMaxAge(7 * 24 * 60 * 60);
response.addCookie(cookie);
cookie = new Cookie("condition2","HIJKLMN");
cookie.setMaxAge(7 * 24 * 60 * 60);
response.addCookie(cookie);
とし(同一セッションで)クッキーを確認すると、後の
"condition2" → "HIJKLMN"
しか作成されないのです。
(sesstion IDである"JSESSIONID"も存在しない)

次に、
Cookie cookie;
cookie = new Cookie("condition1","ABCDEGF");
cookie.setMaxAge(7 * 24 * 60 * 60);
response.addCookie(cookie);
// cookie = new Cookie("condition2","HIJKLMN");
// cookie.setMaxAge(7 * 24 * 60 * 60);
// response.addCookie(cookie);
とし(同一セッションで)クッキーを確認すると、
"condition1" → "ABCDEGF"
が作成されます。
(しかしまだ"JSESSIONID"が存在しない)

次に、
Cookie cookie;
// cookie = new Cookie("condition1","ABCDEGF");
// cookie.setMaxAge(7 * 24 * 60 * 60);
// response.addCookie(cookie);
// cookie = new Cookie("condition2","HIJKLMN");
// cookie.setMaxAge(7 * 24 * 60 * 60);
// response.addCookie(cookie);
とし(同一セッションで)クッキーを確認すると、
"JSESSIONID" → "3FC8A45A30A0385B17722B800E965495"
が作成されます。
つまり、
「JSP側でクッキーを使用したために、セッションIDが保存されず、結果的にsessionが保持されなかった」
という状況のようです。
環境設定などをもう一度調べてみます。

<SJ0392さんへ>
どうぞよろしくお願いします。
助言頂いた内容について、これから調べることろです。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-03-25 13:24
ども、ほむらです。
書き捨てる形で申し訳ないのですが。
-----------
実験できているということは
その”他のページ”ではクッキーが一部なりとも参照できるのですよね?

あとは、適当にキャプチャして実際に
どんなクッキーが発行されているのか確認してみるのもいいかも
HTTPヘッダのSet-Cookie:というのがクッキーのデータです

クッキーのヘッダはブラウザで作成すると思うのでTELNETだとだめかも?
あっJSPなら平気かな?サーバーからの応答だし。。。
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2004-03-30 14:47
まだ未解決ですが中間報告です。

<SJ0392さんへ>
Servletコンテナは TOMCATです。

> Cookie に特に情報を持たせないのであれば Cookie を意識する必要はありません。
セッションもクッキーも両方使いたいのです。セッションはページ間の情報共有に、
クッキーはブラウザを一旦閉じて、次に開いた時のデフォルトとして保持したいのです。

> Jserv の設定ファイルに cookie を有効・無効にする設定があるので有効にして下さい。
TOMCAT にも設定はありますか? 見当たらなかったので「無条件に有効」なのかと解釈していますが・・・

<ほむらさんへ>
> どんなクッキーが発行されているのか確認してみるのもいいかも
> HTTPヘッダのSet-Cookie:というのがクッキーのデータです
私の環境では、ヘッダ情報の cookieという変数にクッキー情報が入るようです。
この中身を見た結果は、前回(2004-03-25 11:50)回答と同様でした。
1. 2つのクッキー発行を行なうと、後のクッキーのみセットされる。
2. 1つのクッキー発行を行なうと、そのクッキーがセットされる。
3. クッキーの発行を行なわないと、JSESSIONIDというセッション管理の為のクッキーがセットされる
といった具合です。
キルシェ
常連さん
会議室デビュー日: 2004/03/25
投稿数: 26
投稿日時: 2004-03-30 20:55
途中から割り込んでしまいますがご容赦を。

一つのCookieでは使えて、同時に二つのCookieが使えないのであれば、
二つをまとめて一つのCookieとして扱えば良いのではないでしょうか。

他に問題が無ければ、という前提ですが。
#よく覚えてませんが、Cookieの長さの制限があった様な気が…。(^_^;;

スキルアップ/キャリアアップ(JOB@IT)