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()メソッドで文字列を取得する。