HTTP Cookie

クライアントに少量のデータを保存できる仕組み。

例えば、Webサイトの掲示板への書き込みにおける名前、メールアドレス等を
クッキーに保存しておき、次回以降のアクセスで予め入力してある状態にさせる等の用途で使われる。

クッキー発行方法

public void service(HttpServletRequest req, HttpServletResponse res) {

 // Cookieの作成
 Cookie cookie = new Cookie("cookieName", "cookieData");
 // 有効範囲ドメインの設定
 cookie.setDomain("domain");
 // 有効期限の設定
 cookie.setMaxAge("expire[/s]")l
 // レスポンスにクッキーを追加
 res.addCookie(cookie);

}

setDomainメソッドで、このクッキーの取得できるドメインの範囲を指定する。
指定がない場合、クッキーを発行した際のURLのみに許可。
例えば、hogehoge.dummy.co.jpというホストで発行したクッキーだが、
foobar.dummy.co.jpというホストでもそのクッキーを利用したい場合は、

cookie.setDomain("dummy.co.jp");

とする。
ドメイン名はトップレベルの一階層下までしか設定できないため、汎用的なクッキーは作成できない。
(comやnetのようなものであればdummy.comというように、.が1個以上、
co.jpのようなものであればdummy.co.jpのように、.が2個以上。)

ドメインは何を基準にするのか。

HTTPリクエストヘッダのhostヘッダ。

http://localhost:8080/sampleにアクセスすると、
Host: localhost:8080

http://127.0.0.1:8080/sampleにアクセスすると、
Host: 127.0.0.1:8080

setMaxAgeメソッドで、このクッキーの有効期限を秒単位で指定する。
負数の場合や、指定がない場合、ブラウザを閉じるまでが有効期限。
0秒をセットすると、クッキーが削除される。

最後に、レスポンスにaddCookieメソッドでクッキーを追加する。

クッキー受領/変更方法

public void service(HttpServletRequest req, HttpServletResponse res) {

 // Cookieの取得
 Cookie[] cookies = req.getCookies();
 Cookie targetCookie;
 if (cookies != null) {
  for (Cookie cookie : cookies) {
    if (cookie.getName().equals("targetCookieName") {
      Cookie targetCookie = cookie;
      break;
    }
  }

   // Cookieに保存したデータを取得
   String value = targetCookie.getValue();
   // 新しいCookieデータを保存
   String newValue = "newCookieValue";
   targetCookie.setValue(newValue);
   // レスポンスにクッキー追加(名前が同じであれば上書き)
   res.addCookie(targetCookie);
   
 }
}

大きくわけて3つある。

クッキーの取得

Javaではクッキーはリクエストから配列で一括取得する方法しか提供されていない。
配列で一括取得してきた中から、必要なクッキーか否かをクッキー名で判断し、取得している。
getCookies()メソッドの実行結果、一つもクッキーが保存されていなければnullが返るため、nullチェックが必要。

クッキーに保存したデータの取得

getValue()メソッドで文字列を取得する。

クッキーに保存する情報

文字化けを防ぐために、URLEncodeを行う必要がある。
java.url.URLEncoderクラスのencode()メソッドを使い、エンコードした値をセットする。
すなわち、クッキーから情報を取り出す際はURLDecodeを行う必要がある。
java.url.URLDecoderクラスのdecode()メソッドを使い、デコードしてから利用する。
*content-typeがapplication/x-www-form-urlencodedの場合、半角スペースを+として扱うため、注意が必要。

クッキーに保存させる情報の形式

なんでも良い。
複数の値を保存する際、一般的には&を使う。
また、1個1個の値にキー値を用意し、キー値と値を=で繋ぐ。
(URLEncodeを行うと、&や=の文字がエスケープされるため、使いやすい)

key=value&key=value...

固定長にすることでも対応できる。

loginId1%20%20password%20%20        

ログインIDが先頭10桁、パスワードがその次の10桁。
*10桁未満のデータの場合は半角スペース(URLエンコードすると%20)で詰めるなどの約束を決める。