JavaサーブレットでのCookieとセッションの処理

JavaサーブレットでのCookieとセッションの処理

1. 概要

このチュートリアルでは、the handling of cookies and sessions in Java, using Servletsについて説明します。

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

簡単に言えば、a cookie is a small piece of data stored on the client-side which servers use when communicating with clientsです。

後続のリクエストを送信するときのThey’re used to identify a client。 また、あるサーブレットから別のサーブレットにデータを渡すためにも使用できます。

詳細については、to this articleを参照してください。

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

クライアントに送信するには、create one and add it to the responseを実行する必要があります。

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

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

特定のCookieが有効である秒数を定義する最大経過時間(メソッドmaxAge(int)を使用)を設定できます。

uiColorCookie.setMaxAge(60*60);

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

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

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

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

uiColorCookie.setDomain("example.com");

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

If we don’t specify a domain explicitly, it will be set to the domain namewhich created a cookie

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

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

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

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

uiColorCookie.setPath("/welcomeUser");

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

次に、Servlet内の値を取得する方法に焦点を当てましょう。

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

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

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

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

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

Toremove a cookie from a browser, we have to add a new one to the response with the same name, but with a maxAge value set to 0

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

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

これで、Servlet内のCookieを処理する方法がわかりました。

次に、Servletから頻繁にアクセスするもう1つの重要なオブジェクトであるSessionオブジェクトについて説明します。

3. HttpSessionオブジェクト

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

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

セッションは、Cookieまたは要求パラメーターによってクライアントと照合されます。 詳細については、hereを参照してください。

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. Session属性

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

  • 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プロトコルはステートレスであるため、リクエスト間で状態を維持することは必須です。

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