- PR -

CookieバージョンとIE6の挙動について

1
投稿者投稿内容
いっぽ
会議室デビュー日: 2005/08/30
投稿数: 12
投稿日時: 2005-08-30 17:39
WindowsXP+Eclipse3.0+Tomcat5.0.28で開発しています。

Cookie.setVersion, getVersionの挙動を調べていたのですが、
どうも納得のいく結果が得られないので、アドバイスいただけますと
幸いです。

String value = URLEncoder.encode("テスト用クッキーです" , "Shift_JIS");
Cookie cookie = new Cookie("testcookie", value);
cookie.setComment("テストの目的です。");
cookie.setMaxAge(60 * 5);
cookie.setVersion(1);
res.addCookie(cookie);

上記のようなコードで、一旦ブラウザ側でクッキーを保存させ、
その後cookie.getComment()すると、コメントがnullのままです。

原因を模索してみたのですが、保存後getCommentするときに
getVersionすると、"1"と設定したバージョンが"0"に戻って
しまっています。

これは設定方法が悪いのでしょうか。それともIEのCookieの
サポートバージョンが原因なのでしょうか。元々Cookie ver.1は
まだ実験段階らしいという情報は見つけましたが、今ひとつ
釈然としません。

また、ver.0で発行したクッキーは、ブラウザがCookieディレクトリに
クッキーを保存しているようですが、ver.1については同じ場所には
保存しないようです。

是非教えていただけないでしょうか。よろしくお願いいたします。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2005-08-30 18:15
Cookie.setVersion, getVersionのバージョンとは
RFCに定義されるプロトコルのバージョンを意味します。
よって、いっぽさんが考えている意味とは全く違います。

なんでデフォルト0なのかというとTomcatのソースからは
0が設定されているのが確認できました。
private int version = 0; // ;Version=1 ... means RFC 2109++ style
で、このプロトコルですが“1”の1つして定義されていませんので
かならず0が返るのだと思います。
(Tomcatだけで他のアプリケーションサーバは知りませんが、、)


いっぽ
会議室デビュー日: 2005/08/30
投稿数: 12
投稿日時: 2005-08-30 18:40
いっきゅうさん>

ご返答ありがとうございます。
すいません、自分が誤解している点はブラウザの仕様とは
関係ないということでよろしいでしょうか?

ご指摘にある
> private int version = 0; // ;Version=1 ... means RFC 2109++ style
であり、Version=1の場合に cookie.setComment()、cookie.getComment()が
有効になるのではないのでしょうか??

逆にブラウザの仕様とは関係ない場合、上記のコメントの設定/取得が
有効になる方法を教えていただけると幸いです。

よろしくお願いします。
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-08-30 23:40
こんばんは。

IE6.0 + Tomcat5.0にてパケットキャプチャしてみました。

【Ver.0】
Cookie cookie = new Cookie("test", "hoge");
cookie.setVersion(0);//Ver.0
cookie.setComment("comment");
cookie.setMaxAge(60 * 5);
response.addCookie(cookie);

レスポンス
Set-Cookie: test=hoge; Expires=Tue, 30-Aug-2005 14:02:17 GMT

リクエスト
Cookie: test=hoge;


【Ver.1】
Cookie cookie = new Cookie("test", "hoge");
cookie.setVersion(1);//Ver.1
cookie.setComment("comment");
cookie.setMaxAge(60 * 5);
response.addCookie(cookie);

レスポンス
Set-Cookie: test=hoge; Version=1; Comment=comment; Max-Age=300

リクエスト
Cookie: test=hoge;

レスポンスの段階では、意図する値がセット出来ているようですね。
RFC2109によると、
Versionは「クッキーのバージョン」
Max-Ageは「Cookieの寿命秒数」
Commentは「Cookieの利用目的とか説明文みたいなもの」
を指定するようです。
http://www.ietf.org/rfc/rfc2109.txt

CommentについてはCookieの利用目的をポップアップなどで表示し、
受け入れるかどうかを判断させる用途で使用されますので、
バージョン1のクッキーをサポートするブラウザがあったとしても
サーバに送信はされないようですが、(リクエストヘッダーの属性
として定義されていない。)Versionについては、送り返すべきです。

ほとんどのブラウザではRFC2109 及び 後発のRFC 2965をサポート
していないとの記述を見つけましたが、IE6.0でもサポートしてい
ないようですね。
サポートしているブラウザ、APサーバがあるのかどうか分かりませ
んが、あるとするならばサーバ側でバージョンは取得出来るがコメ
ントは取得出来ないといった動作をしそうです。
いっぽ
会議室デビュー日: 2005/08/30
投稿数: 12
投稿日時: 2005-08-31 00:16
masaさん>
こんばんは。

パケットキャプチャまでしていただいてありがとうございます。
ver.0とver.1の挙動の違いを見ても、やはりcommentの設定は
ver.1の機能になるのですね。

>Versionについては、送り返すべきです。

私もそう思います。

> サポートしているブラウザ、APサーバがあるのかどうか分かりませ
> んが、あるとするならばサーバ側でバージョンは取得出来るがコメ
> ントは取得出来ないといった動作をしそうです。

確かにおっしゃるとおりです。とすると、ブラウザ側の設定によって
cookie.setComment()が有効に使用されることはあっても、
cookie.getComment()についてはあまり意味のない実装ということに
なりますよね。

本日本屋にていくつかの書籍を漁ってみたのですが、このあたりの情報は
「コメントの設定/取得」に終始しており、Codeレベルでのサンプルは
見つけられませんでした。
#あったとしても実証できる環境はないかもしれませんが。。

いずれにしても、自分が作成したコードレベルでの問題ではないということが
わかりましたので、少しすっきりしました。

ありがとうございます。




1

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