JavaWebにおけるHttpSessionの仕組みと活用法

HttpSessionの基本概要

HttpSessionはJavaWebにおけるセッション管理を行うためのクラスです。サーバー側に保存されるオブジェクトであり、クライアントごとの状態を保持するために利用されます。

Servletの3大ドメインオブジェクト(request、session、application(ServletContext))の1つとして、以下の属性操作メソッドを提供します:

  • setAttribute(String key, Object val):属性をセットする
  • Object getAttribute(String key):属性を取得する
  • removeAttribute(String key):属性を削除する

内部的にはCookieまたはURL書き換えを用いてセッションIDを管理しています。

セッションの適用範囲と取得方法

セッションの範囲は、ユーザーが最初にサーバーへアクセスしてからブラウザを閉じるまでの一連の流れです。この期間中の複数リクエストは「連続したリクエスト」とみなされます。

サーバーは各クライアントごとにsessionオブジェクトを生成し、Map形式のセッションキャッシュで管理します。

コード内での取得例:

// Servlet内での取得
HttpSession userSession = request.getSession();

// JSPでは暗黙オブジェクトとして利用可能
// 記述不要で「session」を直接使用できる

セッション生成の内部処理

request.getSession()を呼び出すと、以下の処理が行われます:

  1. リクエスト内のCookieからJSESSIONIDを探す
  2. IDが存在しない場合:新規セッションを作成し、IDをCookieに保存して返す
  3. IDは存在するがセッションが見つからない場合:同様に新規作成
  4. IDに対応するセッションが存在する場合:既存のセッションを返す

新規作成されたセッションIDは、寿命が-1のCookieとしてブラウザメモリに保存され、ブラウザを閉じるまで維持されます。

なお、request.getSession(false)を使用すると、存在しない場合にnullを返し、新規作成は行われません。

主要メソッド一覧

  • String getId():現在のセッションIDを取得
  • int getMaxInactiveInterval():非アクティブ状態で維持される最大時間(秒)。デフォルト30分
  • void invalidate():セッションを無効化し、次回アクセス時に新しいセッションを生成させる
  • boolean isNew():現在のセッションがまだクライアントへIDを返していない「新規状態」かを判定

web.xmlでのセッション有効期限設定

<session-config>
  <session-timeout>30</session-timeout>
</session-config>

実践例①:異なるServlet間でのデータ共有

SessionSaveServletでデータを保存し、SessionReadServletでそれを読み取る例です。

// SessionSaveServlet内
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    HttpSession session = req.getSession();
    session.setAttribute("message", "セッションに保存されたデータ");
}

// SessionReadServlet内
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    HttpSession session = req.getSession();
    String msg = (String) session.getAttribute("message");
    System.out.println(msg);
}

実践例②:ログイン状態の保持

login.jspから送信された情報をLoginCheckServletで検証し、ログイン成功時にセッションへユーザー情報を保存します。

// LoginCheckServlet内
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    String userId = req.getParameter("userId");
    String password = req.getParameter("password");

    if ("admin".equals(userId) && "1234".equals(password)) {
        HttpSession session = req.getSession();
        session.setAttribute("loginUser", userId);
        resp.sendRedirect("success.jsp");
    } else {
        req.setAttribute("error", "ログイン失敗");
        req.getRequestDispatcher("login.jsp").forward(req, resp);
    }
}

success.jspなどでは、以下のようにログイン状態を判定できます:

<%
    String user = (String) session.getAttribute("loginUser");
    if (user == null) {
%>
    <p>未ログイン状態です。</p>
<%
    } else {
%>
    <p>ようこそ、<%= user %> さん</p>
<%
    }
%>

ブラウザを閉じない限りセッションが維持されるため、保存されたユーザー情報も有効です。

タグ: Java JavaWeb Servlet HttpSession Session管理

6月21日 20:01 投稿