通信するプログラムでCookieを処理したいとき
.NETだとCookieContainerというクラスで簡単にできる。
javaだと、標準ではcookieを処理する機能はない。と思う。
1.5ではCookieHandlerという抽象クラスだけはあったが、
型だけあってもこれをどうしすればよいのか私にはわからなかった。
1.6になってCookieManagerが加わり、これがCookieHandlerの実装をしている
とか書いてあるから、これで標準でCookieが使えるのかと思ったけど
これも、CookieManagerが使ってるCookieStoreがインターフェースだから、
結局これだけじゃ使えないの?
というか、少なくとも今の私に使い方はわからない。
たぶん、使えないんだと思う。
javaのここらへんのところが、よくわからない。
まだ、javaでcookie使うには、以前自分で作ったcookieを簡易に処理するやつを
使わなければいけないのか。
今のところ、これを使ってて問題が生じたことはないけど、
expiresの処理とか全然考えてないし、
自分で書いたものだとなんだか美しくないので、
早く公式なものが使いたいのだが・・・。
とりあえず、今回CookieStoreの中身を簡単に書いといてプログラムを書いとけば
後で標準で実装されても、応用がきく。というために
抽象クラスだけとか、interfaceだけとかが加わってるのかな。
よくわからない。
少なくとも使えないということでは、
これに関して、javaのバージョンがあがっても進歩してない気がする。
なんで、早く実装してくれないんだろ。
私の無知ゆえの勘違いなのかもしれないけど。
0513更新
やっぱ無知ゆえの勘違いだった。と思う。
実装はちゃんとしてある。ただ動かない。というか動かせない。
今、ソース見て頑張ってる。ややめんどい。
とりあえず、複数のクッキーをスプリットしてるところが、なんかおかしい気がするけど、能力の高い人たちがやってんだからおそらく私がおかしいんだろう。
それに、それはうまく動かせないことの本質ではない。
それと、HttpCookieの方の動作も単独で試してみたが、どうもexpiresの判定がおかしいような・・・。まあ、これもきっと私がおかしいんだろう。
それに、問題はそこじゃない。
素人の私でも確実に言えるのは、
CookieHandler.setDefault(new CookieManager());
をしただけでは駄目だということだ。
ハンドラの概念と仕組みがよくわからない。おそらくこれをセットすると接続のたびに実行してくれる、というものだと思うんだけど、それがどう書かれているのだろうか。そういえば、今のアルバイトの作業では、かなりそうした仕組みを使ったコードが多いな。VBだけど近いはず。実際、効率的なプログラムを書くには必要な仕組みなので、これを機会にちゃんと理解して使えるようになっておきたい。
ハンドラを使用しないでCookieManagerを直接使ってみてもどうもうまくはいかない。たしか、javaのページにsunのパッケージは使わないこと推奨、的なことが書いてあった気がするけど、InMemoryCookieStoreってのがCookieStoreをimplementsしてて、それが使われてると思うんだけど、そこらへんのこともよくわからない。
つまり、わからないことだらけだ。
.NETだとCookieContainerというクラスで簡単にできる。
javaだと、標準ではcookieを処理する機能はない。と思う。
1.5ではCookieHandlerという抽象クラスだけはあったが、
型だけあってもこれをどうしすればよいのか私にはわからなかった。
1.6になってCookieManagerが加わり、これがCookieHandlerの実装をしている
とか書いてあるから、これで標準でCookieが使えるのかと思ったけど
これも、CookieManagerが使ってるCookieStoreがインターフェースだから、
結局これだけじゃ使えないの?
というか、少なくとも今の私に使い方はわからない。
たぶん、使えないんだと思う。
javaのここらへんのところが、よくわからない。
まだ、javaでcookie使うには、以前自分で作ったcookieを簡易に処理するやつを
使わなければいけないのか。
今のところ、これを使ってて問題が生じたことはないけど、
expiresの処理とか全然考えてないし、
自分で書いたものだとなんだか美しくないので、
早く公式なものが使いたいのだが・・・。
とりあえず、今回CookieStoreの中身を簡単に書いといてプログラムを書いとけば
後で標準で実装されても、応用がきく。というために
抽象クラスだけとか、interfaceだけとかが加わってるのかな。
よくわからない。
少なくとも使えないということでは、
これに関して、javaのバージョンがあがっても進歩してない気がする。
なんで、早く実装してくれないんだろ。
私の無知ゆえの勘違いなのかもしれないけど。
0513更新
やっぱ無知ゆえの勘違いだった。と思う。
実装はちゃんとしてある。ただ動かない。というか動かせない。
今、ソース見て頑張ってる。ややめんどい。
とりあえず、複数のクッキーをスプリットしてるところが、なんかおかしい気がするけど、能力の高い人たちがやってんだからおそらく私がおかしいんだろう。
それに、それはうまく動かせないことの本質ではない。
それと、HttpCookieの方の動作も単独で試してみたが、どうもexpiresの判定がおかしいような・・・。まあ、これもきっと私がおかしいんだろう。
それに、問題はそこじゃない。
素人の私でも確実に言えるのは、
CookieHandler.setDefault(new CookieManager());
をしただけでは駄目だということだ。
ハンドラの概念と仕組みがよくわからない。おそらくこれをセットすると接続のたびに実行してくれる、というものだと思うんだけど、それがどう書かれているのだろうか。そういえば、今のアルバイトの作業では、かなりそうした仕組みを使ったコードが多いな。VBだけど近いはず。実際、効率的なプログラムを書くには必要な仕組みなので、これを機会にちゃんと理解して使えるようになっておきたい。
ハンドラを使用しないでCookieManagerを直接使ってみてもどうもうまくはいかない。たしか、javaのページにsunのパッケージは使わないこと推奨、的なことが書いてあった気がするけど、InMemoryCookieStoreってのがCookieStoreをimplementsしてて、それが使われてると思うんだけど、そこらへんのこともよくわからない。
つまり、わからないことだらけだ。
すでに自己解決なさっているかもしれませんが、Java SE 6の“仕様上”は、
CookieHandler.setDefault(new CookieManager());
とするだけで、Cookie周りのほとんどの処理は自動化されます。
ですが、実際にはバグが多く、特に、Locale.JAPANなどでは、
ご指摘の通り、expiresの判定に問題があり、あらゆるCookieが保存されません。
具体的には、HttpCookie#expiryDate2DeltaSeconds(String)内の、
expiresからDateを生成するところで、ParseExceptionになります。
これは、Locale.JAPANでは曜日は日本語なのに、expiresは英語で、
にもかかわらず、DateFormat#parseでLocaleが指定されていないことが原因です。
Bug Database
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6610534