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

2010年8月 5日 (木)

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

 前回の記事からの続きです。

 前回Webサイト上の通信にはCookie処理が必要不可欠だということを述べました。そこでCookieをJavaで扱えるようにして、色々なWebサイトやAPIと通信するようなプログラムを作るぞ!と思っていたのですが、ここで大きな壁が立ちはだかっていました。

 検索すると多くのページが見つかると思いますが、Java標準のCookie処理機構を用いたプログラムではCookieや、それに含まれているSessionIDの取得がうまくできないということが多く起こります。

 なぜ取得できないのか? 現象としては、いざJavaを使いWebページへログインしてSessionIDの入ったCookieを受け取った!という段階で、実際にCookieの格納場所を見てみると空っぽ、ということが起こるのです。

 この現象については皆さんそれぞれ工夫されているようで、自力で応答ヘッダからCookieとSessionIDを読み取って、それを送信時にリクエストヘッダにセットし直すなどの対処をしている人が多いようです。この方法は確実ですし、手っ取り早いのでいいのですが、根本的な解決ではありませんし、なにより毎回の作業が増えてしまいます。

 なんとかしてこのJavaのCookie処理機構の遺産を活かすことができないか…というのがこのシリーズの目標です。

・JavaでのHTTPクッキーの取得方法

 まず本題であるJavaのCookie処理のバグについて話す前に、前提であるCookie処理のクラスやその基本の使い方を説明しておきたいと思います。

 Webサイトへアクセスする際にはHttpURLConnectionが使われますが、このクラスは前回紹介したCookieManagerと見えないところで連携しており、Webサイトへアクセスする際には送信するCookieが無いかCookieManagerへ問い合わせ、自動でリクエストヘッダへCookieをセットしてくれます。

 逆に、サイトへアクセスした後、サーバからクッキーが送られてきた場合にもHttpURLConnectionは受け取ったCookieをCookieManagerへ渡してくれます。CookieManager内ではサーバのドメインごとに送るCookieを選んだり、色々な条件に基づいてCookieを削除したりといった作業を行っています。

 最終的に保存されたCookieを取得するには、CookieManagergetCookieStore()メソッドを使い、CookieStoreを取り出します。これが実質のCookie保存場所であり、この中からgetCookies()メソッドを使うことでHttpCookieのリストを得ることができます。

 CookieManagerは複数作ることができて、状況に応じて切り替えるといったことができます。CookieHandler.setDefault(CookieManager)というメソッドでCookieManagerを指定することで、HttpURLConnectionにて呼び出されるCookieManagerが切り替わります。

CookieManager man = new CookieManager();
CookieHandler.setDefault(man);
URL url = new URL("http://www.yahoo.co.jp")
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.getResponseCode();

CookieStore store = man.getCookieStore();
List<HttpCookie> cookies = store.getCookies();

 

 クッキーの内容を表示してみた結果は下のようになります

url : http://www.yahoo.co.jp/
cookie

name : B
value : b5vq21165l7m8&b=3&s=gs
domain : .yahoo.co.jp
path : /
maxage : 63189418
secure : false
port : null 

 ちゃんと取得できてるようですね!

 え?取得できない?
 もしかしたら、このような単純なクッキー取得でさえも上手くいかない人がいるかもしれません。次回は、第一のバグ、クッキーの解析失敗バグについて触れたいと思います。

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

Java」カテゴリの記事

コメント

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

トラックバック


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

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