1. 概要

このチュートリアルでは、サーブレットを使用したJavaでのCookieとセッションの処理について説明します。

さらに、Cookieとは何かについて簡単に説明し、Cookieの使用例をいくつか紹介します。

2. クッキーの基本

簡単に言えば、 Cookieは、サーバーがクライアントと通信するときに使用するクライアント側に保存される小さなデータです

後続のリクエストを送信するときにクライアントを識別するために使用されます。 また、あるサーブレットから別のサーブレットにデータを渡すためにも使用できます。

詳細については、この記事を参照してください。

2.1. クッキーを作成する

Cookie クラスは、javax.servlet.httpパッケージで定義されています。

クライアントに送信するには、作成して応答に追加する必要があります。

Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);

ただし、そのAPIははるかに広いので、調べてみましょう。

2.2. クッキーの有効期限を設定する

最大年齢を設定できます(メソッド maxAge(int)を使用)。これは、特定のCookieが有効である秒数を定義します。

uiColorCookie.setMaxAge(60*60);

最大年齢を1時間に設定しました。 この時間以降、Cookieはクライアント(ブラウザ)がリクエストを送信するときに使用できなくなり、ブラウザのキャッシュからも削除する必要があります。

2.3. Cookieドメインを設定する

Cookie APIのもう1つの便利なメソッドは、 setDomain(String)です。

これにより、クライアントが配信するドメイン名を指定できます。 ドメイン名を明示的に指定するかどうかにも依存します。

Cookieのドメインを設定しましょう。

uiColorCookie.setDomain("example.com");

Cookieは、example.comとそのサブドメインによって行われた各リクエストに配信されます。

ドメインを明示的に指定しない場合、Cookieを作成したドメイン名に設定されます。

たとえば、 example.com からCookieを作成し、ドメイン名を空のままにすると、 www.example.com (サブドメインなし)に配信されます。

ドメイン名に加えて、パスを指定することもできます。 次にそれを見てみましょう。

2.4. クッキーパスを設定する

パスは、Cookieが配信される場所を指定します。

パスを明示的に指定すると、Cookieが指定されたURLとそのすべてのサブディレクトリに配信されます。

uiColorCookie.setPath("/welcomeUser");

暗黙的に、Cookieとそのすべてのサブディレクトリを作成したURLに設定されます。

次に、サーブレット内でそれらの値を取得する方法に焦点を当てましょう。

2.5. サーブレットでCookieを読み取る

クッキーはクライアントによってリクエストに追加されます。 クライアントはパラメータをチェックし、現在のURLに配信できるかどうかを判断します。

サーブレットに渡されたリクエスト( HttpServletRequest )で getCookies()を呼び出すことにより、すべてのCookieを取得できます。

この配列を反復処理して、必要な配列を検索できます。たとえば、名前を比較します。

public Optional<String> readCookie(String key) {
    return Arrays.stream(request.getCookies())
      .filter(c -> key.equals(c.getName()))
      .map(Cookie::getValue)
      .findAny();
}

2.6. クッキーを削除する

To ブラウザからCookieを削除するには、同じ名前の応答に新しいCookieを追加する必要がありますが、maxAge値は0に設定されています。

Cookie userNameCookieRemove = new Cookie("userName", "");
userNameCookieRemove.setMaxAge(0);
response.addCookie(userNameCookieRemove);

Cookieを削除するためのサンプルの使用例は、ユーザーのログアウトアクションです。アクティブなユーザーセッション用に保存された一部のデータを削除する必要がある場合があります。

これで、サーブレット内でCookieを処理する方法がわかりました。

次に、サーブレットから頻繁にアクセスするもう1つの重要なオブジェクトであるセッションオブジェクトについて説明します。

3. HttpSessionオブジェクト

HttpSession は、さまざまなリクエスト間でユーザー関連データを保存するためのもう1つのオプションです。 セッションは、コンテキストデータを保持するサーバー側のストレージです。

データは異なるセッションオブジェクト間で共有されません(クライアントはそのセッションからのデータにのみアクセスできます)。 キーと値のペアも含まれますが、Cookieと比較すると、セッションにはオブジェクトを値として含めることができます。 ストレージの実装メカニズムはサーバーに依存します。

セッションは、Cookieまたはリクエストパラメータによってクライアントと照合されます。 詳細については、こちらをご覧ください。

3.1. セッションの取得

リクエストから直接HttpSessionを取得できます。

HttpSession session = request.getSession();

上記のコードは、存在しない場合に備えて新しいセッションを作成します。 次のように呼び出すことで同じことを達成できます。

request.getSession(true)

新しいセッションを作成せずに既存のセッションを取得したい場合は、次を使用する必要があります。

request.getSession(false)

初めてJSPページにアクセスすると、デフォルトで新しいセッションが作成されます。 session属性をfalse:に設定することで、この動作を無効にできます。

<%@ page contentType="text/html;charset=UTF-8" session="false" %>

ほとんどの場合、Webサーバーはセッション管理にCookieを使用します。 セッションオブジェクトが作成されると、サーバーはJSESSIONIDキーとセッションを識別する値を使用してCookieを作成します。

3.2. セッション属性

セッションオブジェクトは、特定のユーザーセッション用に作成された属性にアクセス(作成、読み取り、変更、削除)するための一連のメソッドを提供します。

  • setAttribute(String、Object)は、セッション属性を作成するか、キーと新しい値に置き換えます。
  • getAttribute(String)は、指定された名前(キー)の属性値を読み取ります
  • removeAttribute(String)は、指定された名前の属性を削除します

getAttributeNames()を呼び出すことで、既存のセッション属性を簡単に確認することもできます。

すでに述べたように、リクエストからセッションオブジェクトを取得できます。 すでに持っている場合は、上記の方法をすばやく実行できます。

属性を作成できます:

HttpSession session = request.getSession();
session.setAttribute("attributeKey", "Sample Value");

属性値は、そのキー(名前)によって取得できます。

session.getAttribute("attributeKey");

属性が不要になったときに削除できます。

session.removeAttribute("attributeKey");

ユーザーセッションのよく知られた使用例は、ユーザーが当社のWebサイトからログアウトしたときに、保存されているデータ全体を無効にすることです。 セッションオブジェクトは、その解決策を提供します。

session.invalidate();

このメソッドはWebサーバーからセッション全体を削除するため、Webサーバーから属性にアクセスできなくなります。

HttpSession オブジェクトにはより多くのメソッドがありますが、前述したものが最も一般的です。

4. 結論

この記事では、サーバーへの後続のリクエスト間でユーザーデータを保存できる2つのメカニズム(Cookieとセッション)について説明しました。

HTTPプロトコルはステートレスであるため、リクエスト間で状態を維持する必要があることに注意してください。

いつものように、コードスニペットはGithub利用できます。