« どうしてJaveでCookieが取得できないんだろう?(2) | トップページ | どうしてJaveでCookieが取得できないんだろう?(4) »

2010年8月23日 (月)

どうしてJaveでCookieが取得できないんだろう?(3)

 前回からの続きです

 これまでJavaでWebサイトにアクセスし、クッキーを取得するためのクラスや、その使い方を見てきました。そして実際に取得し、内容を表示するというところまで紹介しました。そして今回はJavaでクッキーを取得できないという第一のバグ、クッキーの「expire解析失敗バグ」について紹介します。

 最初に以下のクッキー内容取得の実行結果を見てください

java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)

Locale.setDefault(Locale.US)無し

uri           : http://www.google.co.jp/
cookie name   : PREF
cookie value  : ID=7bd227444e93a18e:TM=1280988476:LM=1280988476:S=bokonC_ksiGm2V3A
cookie domain : .google.co.jp
cookie path   : /
cookie maxage : 0 - (Thu Aug 05 15:07:56 JST 2010)
cookie secure : false
cookie port   : null

Locale.setDefault(Locale.US)有り

uri           : http://www.google.co.jp/
cookie name   : PREF
cookie value  : ID=010eb8da414554a5:TM=1280988552:LM=1280988552:S=yh0MOlC2T0sHbAi9
cookie domain : .google.co.jp
cookie path   : /
cookie maxage : 63071999 - (Sat Aug 04 15:09:11 JST 2012)
cookie secure : false
cookie port   : null

 これは、クッキーの有効期限であるexpireの解析が失敗し、値を読み込めていない状態と、成功して正常に読み込めている2つの実行結果を示しています。

 この2つの実行結果の違いはなんでしょうか? 赤字で示されていますが、CookieのMaxage値が異なっています。一方は0で、もう一方は63071999です。実行環境は同じなのですが、どうしてこのように実行結果に違いが出たのでしょうか?
 違いについては既に示してあるのですが、Javaのデフォルトのロケーションに変更を行っています。実はJavaはロケーションがJapanのままだと、expireの解析に失敗します。(※ちなみにJREのバージョン"1.6.0_20"ではこの問題が修正されています!
参考リンク
 
 
 実はJavaは、クッキーヘッダの有効期限を解析する際に、各地域の言語に合わせて読み込もうとしています。なので、標準の書式である
 Sat, 04-Aug-2012 15:09:11 GMT

というヘッダ内の有効期限を、日本国内では

土, 04-8-2012 15:09:11 GMT
と認識しようとしているのです。
 当たり前ですがこのようなクッキーヘッダは存在しませんから、100%解析に失敗します。
expireの解析に失敗するとどうなるでしょう?MaxAgeとは、クッキーの残り有効秒数のことです。この値に0が格納されるため、このクッキーは直ちに削除されます。
(上の実行結果はどうやって取得したのかというと、クッキーの削除はCookieStoreが担っているので、CookieStoreへ格納するかの是非を判定するCookiePolicyをラップし、内容を表示してから真偽を返すように実装してあります。)

 以上のことから、日本国内ではHttpURLConnectionを使ってクッキーを扱う際には、その前にLocale.setDefault(Locale.US)を実行する必要があります。JavaVMに、ここはアメリカだよ~と教えておくことで、英語でexpireを解析してくれるようになります。

 さて、これで少なくともクッキー取得できない現象は回避できるようになりましたか?対策もばっちりですね。しかし! まだ我々には問題が立ちはだかっているのです。次回は、現在進行形で存在する問題、「クッキー適用順の怪」について触れていきたいと思います。

« どうしてJaveでCookieが取得できないんだろう?(2) | トップページ | どうしてJaveでCookieが取得できないんだろう?(4) »

Java」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: どうしてJaveでCookieが取得できないんだろう?(3):

« どうしてJaveでCookieが取得できないんだろう?(2) | トップページ | どうしてJaveでCookieが取得できないんだろう?(4) »