セッションとは
Web アプリケーションでは、不特定多数のユーザーからアクセスからユーザーを識別するためセッション管理をすることがあります。
HTTP 通信の仕様は、1つのリクエスト毎にクライアントと Web サーバーとの接続と切断を繰り返すため、2度目のリクエストが同一ユーザーからのアクセスかが Web サーバーから見て分かりません。
しかし、ネットショピングの買い物カゴなど、ユーザーが入力した情報を記憶しておいて、別のページで利用するサービスなどにおいては、Webアプリケーションはユーザー毎に異なる記憶領域を保持してサービスを提供する必要があります。
この問題を解決する方法の1つに「セッション」があります。
セッションを利用することで、Web アプリケーションはユーザー毎に値が異なる「セッションID」を付与したクッキー(Cookie)をクライアント上に送信することで、次回以降のアクセスでは、「セッションID」が付与されたクッキーがブラウザから送信されるため、Web サーバー上のアプリケーションは、ユーザーを識別して情報の記憶や処理を行うことが可能になります。
セッションはキーと値で情報を管理する
セッションはキーと値で情報を管理します。HashMap などの Map インターフェイスを使ったことがあればイメージしやすいでしょう。
サーブレットのような Java の Web アプリケーションでら、これらのキーと値の組み合わせを、セッションIDごとにメモリ上で管理し、HttpSession クラスを通じてセッションの情報にアクセスします。
メモ
HttpSession クラス のようなセッションを扱うくらすでは、基本的にはクライアントから送信されるセッションID に対する情報を返すようになっているため、利用時にはセッションIDの事などあまり意識する必要なく、キーだけでアクセスされたユーザーの記憶領域を参照できます。
HttpSessionでセッションを扱う
前述したように、Java のサーブレットでは、セッションを簡単に扱えるように HttpSession クラスが用意されています。
また、HttpSession クラスのインスタンスは、次のサンプルコードのように HttpServletRequest クラスより取得します。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
}
この時、初めてセッションを作成するユーザーからのアクセスの場合、内部的にセッションが新たに作成され、ユーザーを識別するセッションIDも、この時に発番されます。
セッションに値を格納する
セッションに値を格納する場合は、HttpSession#setAttribute を使用します。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
//セッションにキーと値のペアを格納
session.setAttribute("key", "値");
}
セッションに格納に格納できるのは、文字列などの値はもちろんのこと、配列やオブジェクトが格納できます。ただし、オブジェクトを格納する場合は、対象のオブジェクトがシリアライズ可能になっている必要があります。
オブジェクトのシリアライズについては、以下の記事で詳しく解説しています。
【関連記事】
▶Javaオブジェクトをシリアライズしてファイルに出力
セッションから値を取り出す
セッションから値を取り出すときは、HttpSession#getAttribute メソッドに、取得したいセッションのキーを指定して値を取り出します。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
//セッションから指定したキーの値を取得
String value = (String)session.getAttribute("key");
}
HttpSession#getAttribute メソッドの戻り値は Object 型になるため、setAttribute で格納した型でキャストしてあげる必要があります。
もし存在しないキーを指定して同メソッドを呼び出した場合、戻り値には null が返却されます。
セッションから値を削除
セッションから値を削除する場合は、HttpSession#removeAttribute メソッドを使用します。メソッドんお引数には、削除したいセッションのキーを指定します。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
//セッションから指定したキーの値を削除
session.removeAttribute("key");
}
また、セッションから全ての値を削除する場合は、HttpSession#getAttributeNames で全てのキーを取得し、繰り替えしでセッションから値を削除する方法があります。
HttpSession session = request.getSession();
Enumeration en = session.getAttributeNames();
while(en.hasMoreElements()){
session.removeAttribute((String)names.nextElement());
}
セッションを破棄する
現在のセッションを破棄する場合は、HttpSession#invalidate メソッドを使用します。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
//セッションを破棄
session.invalidate();
}
セッションを破棄することで、現在のリクエストのセッションIDが無効となり、保持していたデータもすべて削除されます。
同じユーザーが、次にセッションにアクセスする時は、新しいセッションIDが生成されます。
まとめ
Javaでセッションを利用して、ユーザーごと(厳密にはブラウザのセッションごと)に値を保持する方法を解説してきました。
セッションは、Web アプリケーションを作る上で欠かせない知識となりますので、是非この機会に覚えておきましょう。