CookieはHTTPを使用したサーバ、クライアント間で、情報のやりとりをするために使われます。Cookieがセッション管理などに使用されていることは読者のみなさんもよくご存じですね。

JSPやServletではCookieを当たり前のように使うことができます。では、Java SEでクライアントを作成する場合はどうでしょう。

CookieはHTTPヘッダとして扱われます。java.net.URLConnectionクラスのgetHeaderFieldメソッドを使えば、サーバから送られてきたヘッダを取得することができるので、取得したヘッダからCookieを取り出すことが可能です。また、setRequestPropertyメソッドを使うことでサーバにCookieを付加して送信することもできます。

とはいうものの、URLConnectionクラスが作成されるたびに、getHeaderFieldメソッドをコールしてCookieをセットし、setRequestPropertyメソッドをコールしてCookieを取り出すのは煩雑です。

そこで、J2SE 5.0ではCookieを扱うための新しいクラスが導入されました。それがjava.net.CookieHandlerクラスです。

CookieHandlerクラスにはCookieHanlderオブジェクトを引数にするsetDefaultメソッドというstaticメソッドがあります。このメソッドによりデフォルトのCookieHandlerオブジェクトを設定することができます。

デフォルトのCookieHandlerオブジェクトを設定してしまうと、URLConnectionクラスでHTTP通信(つまりjava.net.HttpURLConnectionクラスを使用した通信)でのCookieのやりとりに際し、CookieHandlerオブジェクトのコールバックメソッドがコールされます。

Cookieの送信時にコールされるのがgetメソッド、受け入れ時にコールされるのがputメソッドです。

もう少し詳しく見ていくことにしましょう。以下にHttpURLConnectionクラスとCookieHandlerクラスを使用して、Cookieを扱うスキームを示します。

  1. URLクラスのopenConnectionメソッドによりURLConnectionオブジェクトが生成されます。この時、プロトコルがHTTPであれば、HttpURLConnectionオブジェクトが生成されます。
  2. HttpURLConnectionオブジェクトはリソースへの接続を確立する前に、要求ヘッダを作成します。この時、デフォルトのCookieHandlerオブジェクトが設定されていれば、CookieHandlerオブジェクトのgetメソッドをコールします。
  3. getメソッドの引数はURIオブジェクトと、ヘッダ要素が保持されたMapオブジェクトになります。CookieHandlerオブジェクトは自身が保持するCookieの中で、引数のURIに適合するCookieを選択し、ヘッダに追加します。
  4. HttpURLConnection#connectメソッドを使用して接続を確立します。
  5. 接続が確立したら、リモートのリソースより応答ヘッダを取得します。
  6. 応答ヘッダが取得できたら、CookieHandler#putメソッドがコールされます。
  7. putメソッドの引数はURIオブジェクトと、応答ヘッダが保持されたMapオブジェクトです。CookieHandlerオブジェクトはヘッダの中から、Cookieを取り出し、保持します。

このようにデフォルトのCookieHandlerオブジェクトを設定することで、Cookieを集中的に扱うことが可能になります。

では、実際にCookieHandlerクラスを使用して、試してみたいのですが、そう簡単にはいきません。

というのも、CookieHandlerクラスはアブストラクトクラスであり、実際に使用するにはCookieHandlerクラスを派生させたクラスを作成する必要があるからです。

abstractで定義されているメソッドが、上述したgetメソッドとputメソッドです。この2つのメソッドを自作するには、Cookieを扱うためのヘッダ定義や、有効期限、ドメインなどの理解が必要です。

もっと簡単にCookieを扱う方法はないのでしょうか?

実をいうと、J2SE 5.0ではCookieHandlerクラスは導入されたものの、実際に使用できる実装クラスは提供されていません。なんか肩すかしを食らったみたいですね。

実際に使用できるCookieHandlerクラスの実装クラスはJava SE 6の登場まで待たなければならなかったのです。 Java SE 6ではCookieHandlerクラスのデフォルト実装クラスとしてCookieManagerクラスが導入されました。

そのCookieManagerクラスの詳細は…… 来週のお楽しみということにしましょう。

 

Java Plug-inとJava Web StartにはCookieHandlerクラスの実装クラスが提供されています。

第41回を読む

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

ここ数年、夏になると沖縄にいっています。去年までは雨に降られたことがなかったのですが、今年はとうとう台風に遭遇してしまいました。

沖縄のJavaコミュニティであるJava Kücheの一周年記念講演会で講演するため、先月の12日に沖縄に向かいました。ところが、同じく沖縄に来ていたのが台風4号。せっかくの、講演会も中止の憂き目にあってしまいました。

それでも、懇親会だけは開かれました。居酒屋にプロジェクターを持ち込み、講演の内容についてざっくばらんにお話しすることができました。

それにしても、沖縄の台風はすごいとは聞いていましたが、本当にすごかったです。

泊まっていたホテルは建物全体が風で揺れ、窓のサッシからも雨がしみこんできます。倒れているヤシの木も多数。

沖縄でも、今回のような大型台風の直撃は久しぶりだそうです。

なお、中止になってしまった講演会ですが、 仕切り直して8/8に講演会が行なわれました。残念ながら櫻庭は参加できなかったのですが、盛況であったようです。

Presentiment of Typhoon, Okinawa 台風, 沖縄 台風, 沖縄
台風の予感が... 砂浜は海に飲みこまれました 視界はほとんどありません
Java Kuche 懇親会, おもろ殿内, 沖縄 Java Kuche 懇親会, おもろ殿内, 沖縄
こんな感じで話をしました。話しているのは鈴木雄介さん ゴーヤチャンプルを食べながら