- PR -

sessionとcookieについて

投稿者投稿内容
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2004-03-31 08:55
> 二つをまとめて一つのCookieとして扱えば良いのではないでしょうか。
Cookie単体の問題ならそれで解決なのですが、元々の悩みは「sessionとcookieが同時に使えない」ことなのです。
その後のご返答で「セッションIDに保持にもcookieが使用されている」ことが判り、そのそもの原因が「複数のcookieが使えないこと」と見て調べているところなのです。
ブラウザの設定を変えたり、IEだけでなくNetscapeで試したりしましたが変化なし。
やはりTOMCATの設定なのでしょうか? でも何処の設定か判らないでいます。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2004-03-31 09:11
 本当にクッキーを使用したセッションで上手くいかないなら、
URLリライティングを使用すれば良いのでは?
SJ0392
ベテラン
会議室デビュー日: 2004/02/05
投稿数: 62
お住まい・勤務地: 神奈川・横浜
投稿日時: 2004-03-31 13:55
引用:

Desmosediciさんの書き込み (2004-03-31 08:55) より:
> 二つをまとめて一つのCookieとして扱えば良いのではないでしょうか。
Cookie単体の問題ならそれで解決なのですが、元々の悩みは「sessionとcookieが同時に使えない」ことなのです。
その後のご返答で「セッションIDに保持にもcookieが使用されている」ことが判り、そのそもの原因が「複数のcookieが使えないこと」と見て調べているところなのです。
ブラウザの設定を変えたり、IEだけでなくNetscapeで試したりしましたが変化なし。
やはりTOMCATの設定なのでしょうか? でも何処の設定か判らないでいます。


本来なら Desmosediciさん が独自で調べて回答を導いてもらいたいのですが・・・
(1)googleなどの検索エンジンで調べたが理解できないのか?
(2)周囲に聞いても判らなかったのか?
という「どーしても判らないので教えて下さい」という痕跡が見えません。
ですが現時点で進展がないことも踏まえ「どーしても判らない」と判断し回答します。
(あくまでも、これまでの経緯から自分勝手に判断した回答です)


まず複数のCookieを取得する方法
コード:
Cookie[] cookies = request.getCookies();
Cookie cookie_condtion1 = null;
Cookie cookie_condtion2 = null;
int cookie_cnt = cookies.length;
for(int i=0;i<cookie_cnt;i++){
  cookie = cookies[i];
  String cookie_name = cookie.getName();
  // セッションIDも取得できますが合えて無視します
  if(cookie_name.equals("condition1") == true){
    cookie_condtion1  = cookies[i];
  } else if(cookie_name.equals("condition2") == true){
    cookie_condtion2  = cookies[i];
  }
}



Desmosedici さんのプログラム のまんまかもしれませんが・・・
session と cookie を同時に使う方法
コード:
HttpSession session = request.getSession(false);
if(session == null){
  // 新規にセッションを作成する
  session = request.getSession(true);  // この時点でSessionIDがCookieに設定
}

Cookie cookie2; 
cookie2 = new Cookie("condition1","ABCDEGF"); 
cookie2.setMaxAge(7 * 24 * 60 * 60); 
response.addCookie(cookie2); 
Cookie cookie3; 
cookie3 = new Cookie("condition2","XYZ"); 
cookie3.setMaxAge(7 * 24 * 60 * 60); 
response.addCookie(cookie3); 



補足:
ほむら さんが確認してくれといったのはHTTPで送信されているヘッダーだと思います。
Desmosedici さんの回答結果から推測するに手段が判らないと判断させていただきます。
HTTPヘッダーを全て確認する方法
コード:
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()){
  // 取得結果をログにでも出力して確認ください
  // Cookie に何が設定されていたか判るはずです。
  String headerStr = (String)e.nextElement();
  String headerVal = request.getHeader(headerStr);
}



Jservで確認しましたが、Tomcat環境を持っていないのでDesmosediciさんの環境で正常に動作する保証はできません。
ご容赦下さい。
また上記プログラムは判りやすいように書いたつもりなので都合で修正して構いません。
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2004-03-31 18:06
SJ0392さん、助言ありがとうございます。
またサンプルまで用意して頂いて大変恐縮です。

> 独自で調べて回答を導いて・・・
私なりに調べてはいるつもりですが、未だ解決に至っていない状況です。
知識不足で見落としている部分も多いと思われますが・・・
私と全く同じ現象を報告するサイトも見つけたのですが、残念ながらそこにも解決方法はありませんでした。

> まず複数のCookieを取得する方法
私に方のCookie確認も、ほぼ同じプログラムで行なっています。
その結果「複数Cookieが発行されていない」という問題があることがわかった次第です。

> session と cookie を同時に使う方法
これは、私の方とは(sessionの部分が)異なっています。
JSPの場合、HttpSession は明示的に宣言しないで使うようのです。(そう解釈しています)
HttpSession session = ・・・・
という宣言無しに、いきなりsession.setAttribute()や、session.getAttribute() を使います。
セッションは session と言う名前を固定で使うようになっているようです。
翻訳されたサーブレットを見ると、
HttpSession session = null;
・・・・・
try {
_jspxFactory = JspFactory.getDefaultFactory();
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
・・・・・
session = pageContext.getSession();
・・・・・
といった感じになっているのですが、何をやっているかは理解していません。
ここはコンテナに任せるしかないのかと・・・

> ほむら さんが確認してくれといったのはHTTPで送信されているヘッダーだと思います。
> Desmosedici さんの回答結果から推測するに手段が判らないと判断させていただきます。
これは誤解ですね。(なぜそう判断されたのでしょう?)
>> 私の環境では、ヘッダ情報の cookieという変数にクッキー情報が入るようです。
と回答しましたが、これはプログラムでHTTPヘッダを取得して、その中のcookieという変数を確認したという意味です。その内容は「複数のCookie取得する方法」で得たものと同様だったのです。

質問ばかりで申し訳ありませんが、追加で教えてください。
(2004-03-24 20:31 に)Jserv の設定ファイルに cookie を有効・無効にする設定があるので有効にして下さい。
と書いて頂いていますよね。Jservには cookieを設定する部分があるようですが、HTTPサーバにApaheを使用している場合も、cookieの有効/無効を決まるのはJavaコンテナなのでしょうか?

私の抱えている問題に貴重な時間を割いて頂き大変恐縮です。
SJ0392
ベテラン
会議室デビュー日: 2004/02/05
投稿数: 62
お住まい・勤務地: 神奈川・横浜
投稿日時: 2004-03-31 19:38
JSP対応してない Jserv なので全てServletの形で回答させてもらいました。
その辺、ご容赦下さい。

引用:

> ほむら さんが確認してくれといったのはHTTPで送信されているヘッダーだと思います。
> Desmosedici さんの回答結果から推測するに手段が判らないと判断させていただきます。
これは誤解ですね。(なぜそう判断されたのでしょう?)
>> 私の環境では、ヘッダ情報の cookieという変数にクッキー情報が入るようです。
と回答しましたが、これはプログラムでHTTPヘッダを取得して、その中のcookieという変数を確認したという意味です。その内容は「複数のCookie取得する方法」で得たものと同様だったのです。


「cookieという変数に」とあったので最初の投稿にあったプログラム内のCookieと誤解してました。
改めて読み直して「ヘッダ情報の cookieという変数に」と書いてありました。
当方の早とちりでした。気を悪くさせてしまい申し訳ありませんでした。


引用:

(2004-03-24 20:31 に)Jserv の設定ファイルに cookie を有効・無効にする設定があるので有効にして下さい。
と書いて頂いていますよね。Jservには cookieを設定する部分があるようですが、HTTPサーバにApaheを使用している場合も、cookieの有効/無効を決まるのはJavaコンテナなのでしょうか?


説明不足でした。
あまり詳しくないですが回答します。(間違えていたらすみません)
JservにはZoneという概念があり、このZone単位で session に cookie を用いるかどうかという設定があり(Zoneについての説明は省きます)、Zoneのプロパティファイル内にある session.useCookies という項目で設定します。

この設定を true にした場合は cookie と HttpSession は関連します。(このスレッドで議論された事項)

この設定を false とした場合 cookie と HttpSession は無関係となります。
それでも HttpSession を使用したい場合は、cookie の替わりに URL に sessionid を付加させる response.encodeUrl();をコールする必要があります。

つまり、Jserv内の sessionid と関連付ける方法に cookie を用いますか?
というフラグだと認識してます。
決してブラウザとやり取りする cookie の有効/無効 ではないはずです。

------
追記:
回答した責任を放棄する訳ではありませんが誰か纏められる人はいないでしょうか?
当方の環境では成功しているため、Tomcatでの実績のある方、環境設定に詳しい方、のご助言を頂きたく思います。

[ メッセージ編集済み 編集者: SJ0392 編集日時 2004-03-31 20:08 ]
キルシェ
常連さん
会議室デビュー日: 2004/03/25
投稿数: 26
投稿日時: 2004-04-01 01:50
ざっとサンプルを作って確認してみました。
動作確認ベースなので、正式な設定箇所かと問われると困りますが…。

・Tomcatでcookieを設定する箇所
Tomcatインストールディレクトリ\conf\server.xmlのサーブレットコンテナの設定に
cookies="true" という属性があります。"false"に設定するとsessionの継続を
管理しなくなるようで、アクセスごとにsessionオブジェクトが新しく作られています。
※cookies="false"でも、cookie の送受信処理は行っているようです。

・sessionとcookieの同時使用
sessionと複数個のcookieを同時に使用しても、問題なく動いているようです。

確認方法:
長くなるのでコードは示しませんが、JSPのみで次のような処理を行っています。
1-a 送信されたcookieを全て表示
1-b 現在保持している確認用sessionを表示 x2
2-a sessionに値を設定 x2
2-b cookieに値を設定 x2
cookieやsessionには現在時刻を設定していますので、ページのReloadの際に表示値が
変更になっている事を以って、期待した処理であると判断しています。
1-a にて sessionを継続するための"JSESSIONID"cookieと、追加設定したcookie x2 が表示されています。
ちなみに cookie として設定した二つの値は、ブラウザキャッシュのコンテナ名の付いた
cookieファイルに格納されています。

SJ0392さんが提示されているコードと違うのは変数名程度で、ほぼ同じコードで確認しています。

その他:
ブラウザはIE6でセキュリティレベルは「中」、Tomcatは Windows版のver4.1.18 を
WindowsXP Pro で動かしています。
コンテナについてはAdministration Tool での設定でカスタマイズした箇所はほとんどありません。
(デバッグレベルやセッションタイムアウト時間をいじったような記憶はありますが)

プライベートで確認が取れる範囲ですので、Desmosedici さんとは Tomcat のバージョンや
プラットフォームが違うのかもしれませんが。

----
追記:
ブラウザから送られてきたCookieは、setMaxAge(int)の結果が反映されて
いなさそうだというのが疑問ではあります。
それから、sessionオブジェクトに対して余計な記述をしていたので削除しました。

[ メッセージ編集済み 編集者: キルシェ 編集日時 2004-04-01 09:30 ]
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2004-04-01 19:36
Desmosedici です。
数々のご返答、あるいはサンプルプログラムまで掲載して頂いた方、本当にありがとうございます。
しかし・・・
\conf\server.xmlへの、cookies="true" 設定や、
response.sendRedirect(*****);
なんていうのも試みてみましたが、変化なし。
完全に行き詰まった感でです。

そもそも環境に問題があるとすれば、みなさんに余計な手間をかけてしまうばかりで収束しません。
私の方でもう一度環境を見直してみます。
実は今はWINDOW上でテストしているのです。殆どの方はUNIX系で動かされていますよね。
最終的にはRedHatをサーバにする予定なのですが、今は安易にクライアントにApacheとTomcatと入れて評価しています。
きちんとサーバを構築してから、再評価を行ないます。
追って結果は掲載しますので、また宜しければ是非アドバイスをお願いします。
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2004-04-01 20:19
これだけコメントが付いているのに Tomcat のバージョンが何なのかも解からない...

問題が発生する小さな JSP を作って試す。

RequestDumperValve が使えるバージョンの Tomcat を使っているなら、
それを使って、RequestDump を確認する。

小さな JSP と、どんなリクエストをしたらどんな RequestDump になったかを
此処に copy & paste すれば、もっと現状を認識できると思います。

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