4. クッキーとセッション
- 4.1. クッキー
- 4.2. セッション
- 4.3. セッションの終了
- 4.4. クッキーを用いないセッションIDの管理
4.1. クッキー
この節ではクッキーの取り扱いについて説明します。サーブレットではクッキーの情報を「javax.servlet.http.Cookie」クラスで管理しています。このクラスで管理されている情報は、クッキーをサーバから送る際に、HTTPヘッダーに追加される行と対応しています。追加される行は以下のような形式をしています。
Set-Cookie: NAME=VALUE; Max-Age=DATE; path=PATH; domain=DOMAIN_NAME; version=VERSION; comment=COMMENT; secure
それぞれの意味は以下の通りです。
NAME=VALUE | クッキーの名前と値に対応しています。「ID=56」で、「ID」というクッキー名に「56」という値が設定されます。 Cookieクラスのコンストラクタ「Cookie(String,String)」および「setValue」メソッドで値の設定を行い、値の取得は「getName」「getValue」で行います。 |
Max-Age=DATE |
クッキーの残存期間を秒数で指定します。「Max-Age=1000」とした場合は、対象クッキーは1000秒後に消滅します。省略した場合、またはマイナスの値を設定した場合はブラウザが閉じるまでクッキーが保存されます。0を指定した場合、クッキーはブラウザから削除されます。値の設定は「setMaxAge」、取得は「getMaxAge」で。 |
path=PATH | クッキーをサーバに対して送り返すべきパスを指定します。指定されたURIおよびそのサブURIでのみ、クッキーは可視となります。「path=/admin」の場合、「/admin」URI以下で対象となるクッキーが可視となります。値の設定は「setPath」、取得は「getPath」で行います。 |
domain=DOMAIN_NAME |
クッキーをサーバに対して送り返すべきドメインを「.」始まりで指定します。「domain=.example.com」の場合、「example.com」ドメインのサーバに対してクッキーを返します。省略した場合は、クッキーを送り出したサーバのみに返します。値の設定は「setDomain」、取得は「getDomain」で行います。 |
version=VERSION | クッキーのバージョンを指定します。0の場合はNetscape仕様、1の場合はRFC2109仕様のクッキーを使用します。デフォルトの値は「1」です。「setVersion」「getVersion」で値の設定・取得を行います。 |
comment=COMMENT | クッキーにコメントを付加します。Netscape仕様のクッキーでは使用できません。「setComment」「getComment」で値の設定・取得を行います。 |
secure | HTTPS通信で行われる場合のみ、クッキーを送り出す場合に指定します。「setSecure」「getSecure」で設定・設定値の取得を行います。 |
クッキーの作成方法はCookieオブジェクトを使用しますが、クッキーの送信と取得はどう行うのでしょうか。クッキーの送信にはHttpServletResponseの「addCookie」メソッド、取得にはHttpServletRequestの「getCookies」メソッドを使用します。以下はブラウザから送られてきた「id」の値をクッキーに設定するサンプルプログラムです。残存時間は5分で、サーバの全てのディレクトリでクッキーが可視になるよう設定しています。
public final class CookieSetServlet extends HttpServlet{ protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletRequest,IOException{ String id=request.getParameter("id"); Cookie cookie=new Cookie("id",id); cookie.setMaxAge(60*5); cookie.setPath("/"); response.addCookie(cookie); .... } }
以下は、設定されたクッキーを読み出すサーブレットです。
public final class CookieGetServlet extends HttpServlet{ protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletRequest,IOException{ String id=null; Cookie cookies[]=request.getCookies(); if(cookies!=null){ for(int i=0;i<cookies.length;i++){ if(cookies[i].getName().equals("id")){ id=cookies[i].getValue(); break; } } } ... } }
(実習課題1)
以下のサーブレットプログラムを作成しなさい。
- そのページに何回訪れたかを表示する。
- 訪れた回数の情報は、クッキーで管理する。