JavaサーブレットでのCookieとセッションの処理
1概要
このチュートリアルでは、Servletを使ったJavaでのCookieとセッションの処理について説明します。
さらに、Cookieとは何かを簡単に説明し、その使用例をいくつか探ります。
2クッキーの基本
簡単に言うと、** クッキーとはクライアント側に保存された小さなデータで、サーバーがクライアントと通信するときに使用します。
-
その後のリクエストを送信するときに、クライアントを識別するために使用されます。
あるサーブレットから別のサーブレットにデータを渡すためにも使用できます。
詳細については、https://pl.wikipedia.org/wiki/HTTP__cookie[この記事へ]を参照してください。
2.1. クッキーを作成する
Cookie
クラスは
javax.servlet.http
パッケージに定義されています。
それをクライアントに送信するには、作成してレスポンスに追加する必要があります。
Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);
しかし、そのAPIはもっと広いです – それを探りましょう。
2.2. Cookieの有効期限を設定する
与えられたクッキーが何秒間有効であるべきかを定義する最大経過時間を(メソッド
maxAge(int)
で)設定することができます。
uiColorCookie.setMaxAge(60** 60);
最大年齢を1時間に設定します。この時間が過ぎると、リクエストを送信するときにCookieをクライアント(ブラウザ)が使用できなくなり、ブラウザのキャッシュからも削除する必要があります。
2.3. Cookieドメインを設定
Cookie
APIのもう1つの便利なメソッドは
setDomain(String)
です。
これにより、クライアントから配信されるドメイン名を指定できます。ドメイン名を明示的に指定するかどうかによっても異なります。
ドメインをcookieに設定しましょう。
uiColorCookie.setDomain("example.com");
Cookieは、
example.com
およびそのサブドメインによって行われた各要求に配信されます。
-
ドメインを明示的に指定しない場合は、
クッキーを作成した** というドメイン名に設定されます。
たとえば、
example.com
からCookieを作成してドメイン名を空のままにした場合は、(サブドメインなしで)
www.example.com
に配信されます。
ドメイン名とともに、パスを指定することもできます。次に見てみましょう。
2.4. クッキーパスを設定する
パスは、クッキーが配信される場所を指定します。
-
パスを明示的に指定すると、
Cookie
が指定のURLとそのすべてのサブディレクトリに配信されます。
uiColorCookie.setPath("/welcomeUser");
暗黙的に、それはクッキーとそのすべてのサブディレクトリを作成したURLに設定されるでしょう。
それでは、
Servlet
内で値を取得する方法に注目しましょう。
2.5. サーブレット内のCookieを読み取る
クライアントによって要求にクッキーが追加されます。クライアントはパラメータを確認し、現在のURLに配信できるかどうかを判断します。
Servlet
に渡されたリクエスト(
HttpServletRequest
)で
getCookies()
を呼び出すことで、すべてのクッキーを取得できます。
この配列を繰り返し処理し、必要な配列を検索することができます。
public Optional<String> readCookie(String key) {
return Arrays.stream(request.getCookies())
.filter(c -> key.equals(c.getName()))
.map(Cookie::getValue)
.findAny();
}
2.6. クッキーを削除する
-
ブラウザからクッキーを削除するには、
maxAge
の値を0に設定して、同じ名前のレスポンスに新しいクッキーを追加する必要があります。
Cookie userNameCookieRemove = new Cookie("userName", "");
userNameCookieRemove.setMaxAge(0);
response.addCookie(userNameCookieRemove);
Cookieを削除するためのサンプルユースケースはユーザーのログアウトアクションです – アクティブなユーザーセッションのために保存されたデータを削除する必要があるかもしれません。
これで、サーブレット内でCookieを処理する方法がわかりました。
次に、
Servlet
から頻繁にアクセスするもう1つの重要なオブジェクト、つまり
Session
オブジェクトについて説明します。
3
HttpSession
オブジェクト
HttpSession
は、異なるリクエストにまたがってユーザー関連のデータを格納するためのもう1つのオプションです。セッションは、コンテキストデータを保持するサーバーサイドのストレージです。
データは異なるセッションオブジェクト間で共有されません(クライアントはそのセッションからのみデータにアクセスできます)。キーと値のペアも含まれていますが、Cookieと比較して、セッションには値としてオブジェクトを含めることができます。ストレージ実装メカニズムはサーバーに依存します。
セッションは、Cookieまたは要求パラメータによってクライアントと照合されます。
より多くの情報はhttps://en.wikipedia.org/wiki/Session
(computer
science)[こちら]を見つけることができます。
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サーバーからセッション全体を削除するので、それ以降は属性にアクセスできません。
HttpSession
オブジェクトにはより多くのメソッドがありますが、ここで説明したものが最も一般的です。
4結論
この記事では、サーバーへの後続の要求間にユーザー・データを保管できるようにする2つのメカニズム(Cookieとセッション)について説明しました。
HTTPプロトコルはステートレスなので、リクエスト間で状態を維持することは必須です。
いつものように、コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/javax-servlets[over on Github]から入手できます。