Javaに関する様々な情報をご紹介します。

6セッション管理

Javaに関する様々な情報をご紹介します。

セッション管理

このページでは、Servletプログラムでのセッション管理について解説します。

概要

セッション管理は異なるページ間で同一のクライアントを認識する方法です。ショッピングサイトなどで、異なるページにわたって、同一クライアントの情報を管理する場合などに使用します。Servletプログラムはセッション管理にクライアントごとに割り当てるセッションIDを使用します。

セッションIDは以下の手順で管理されます。

  1. クライアントが初めてServletプログラムにアクセスした際、セッションIDが生成されます。
  2. 生成されたセッションIDはクライアントに返され保管されます。
  3. 再びクライアントがServletプログラムにアクセスする際にセッションIDがクライアントから送信されます。
  4. Servletプログラムでは送信されたセッションIDにより、同一クライアントかどうかを判断します。

これらの一連の処理はcookieにより管理されます。cookieが使えない環境では、URLリンクでセッションIDを管理することもできます。

メソッド

セッション管理に関連するメソッドについて解説します。

戻り型 メソッド 説明
Http
Session
getSession( ) HttpServletRequestインタフェースで定義されているメソッドです。セッションオブジェクト(セッションID)を返します。セッションオブジェクトが生成されていない場合は、セッションオブジェクトを生成して返します。
Object getAttribute(String) HttpSessionインタフェースで定義されているメソッドです。引数に指定されたデータ名に該当するセッションスコープのデータ値を返します。該当のデータ名がない場合にはnullを返します。
void setAttribute(String, Object) HttpSessionインタフェースで定義されているメソッドです。第一引数にデータ名、第二引数にデータ値を指定し、セッションスコープを持つデータ値を登録します。すでにデータ名が存在する場合は、新しく指定されたデータ値が上書きされます。
void invalidate( ) 生成されているセッションオブジェクト(セッションID)を破棄します。
boolean isNew( ) クライアントがセッション管理されていないときにtrueを返します(初めてアクセスしたとき、クラインアントがcookieを使えないときなど)。クライアントがセッション管理されていないときにtrueを返します(初めてアクセスしたとき、クラインアントがcookieを使えないときなど)。

セッションのタイムアウト

セッションIDは一定時間経過するか、クライアントのブラウザを閉じるか、もしくはinvalidateメソッドを呼び出すと削除されます。どの程度経過するとセッションIDが削除されるかはweb.xmlの<session-config>タグで指定できます。Tomcatのデフォルトの設定では30分になっています。また、HttpSessionインタフェースには、セッションごとに経過時間を設定できるsetMaxInactiveIntervalメソッド、getMaxInactiveIntervalメソッドが用意されています。

<session-config>タグのサブ要素

要素 内容 デフォルト 要素数
session-
timeout
セッションのタイムアウト時間を分単位で指定します。0もしくは0以下の値を指定した場合は、セッションがタイムアウトしないことを表します。 - optional

【設定例】セッションのタイムアウトを180分に設定した例です。<session-config>タグは<servlet>タグ、<servlet-mapping>タグの後に記述する必要があります。

<session-config>
    <session-timeout>180</session-timeout>
</session-config>

使用例

セッション管理を使用したプログラム例について解説します。セッション管理されているかどうかを判別して、表示メッセージを変えるプログラムです。

【SessionServlet.java】クライアントがセッション管理されていないときに"id + Nice to meet you."を表示し、セッション管理されているときには"Hello! + id"を表示します。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SessionServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        String id = "Java";

(1) セッションオブジェクトが生成されていない場合、getSessionメソッドでセッションオブジェクトを生成します。
セッションオブジェクトがすでに生成されている場合は、既存のセッションオブジェクトを返します。

        HttpSession hs1 = req.getSession();

        PrintWriter out = res.getWriter();
        out.println("<HTML>");
        out.println("<BODY>");

(2) クライアントがセッション管理されているかどうか(はじめてアクセスしたかどうか)で表示メッセージを変えます。
セッション管理されていない場合、データidをsetAttributeメソッドで保存し、"id + Nice to meet you."を表示します。
セッション管理されている場合は、データidの値をgetAttributeメソッドで取得し、"Hello! + id"を表示します。

        if (hs1.isNew()) {
            hs1.setAttribute("id", id);
            out.println(hs1.getAttribute("id") + " Nice to meet you.");
        } else {
            out.println("Hello! " + hs1.getAttribute("id"));
        }

        out.println("</BODY>");
        out.println("</HTML>");
    }
}

【実行結果】Servletプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。

Javaの道_セッション管理

cookieが使用できない場合のセッション管理

クライアントがcookieを使用できない場合、URLリンクにセッションIDを付与することによりセッション管理ができるようになります。ServletプログラムはURLリンクから、同一クライアントかどうかを判別します。セッションIDが付与されたURLリンクを作成するためには以下のメソッドを使用します。

戻り型 メソッド 説明
String encodeURL
(String)
HttpServletResponseインタフェースで定義されているメソッドです。引数に指定されたURLにセッションIDを付与したURLを生成します。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しません。
String encodeRedirectURL(String) HttpServletResponseインタフェースで定義されているメソッドです。sendRedirectメソッドで使用するためにセッションIDを付与したURLを生成します。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しません。

プログラム

String url = res.encodeURL("./SessionServlet");
out.println("<A HREF=\"" + url + "\">SessionServlet</A>");

実行結果

<A HREF="./SessionServlet;jsessionid=8692969BBD04A69879B6206276D54D1D">
    SessionServlet
</A>

6セッション管理