セッションとは?【JavaのServletとJSPでの使い方】

1. セッションとは?

セッション (Session) とは、ユーザーごとに一時的な情報をサーバー側に保存する仕組みのことです。

  • 「このユーザーが誰か」を特定するための仕組み
  • 一度ログインしたら、その情報(ログイン状態)をページを移動しても維持できます。
  • サーバー側に情報が保存されるので、クライアント側のブラウザが閉じても、セッションは残る場合があります

2. なぜセッションが必要なのか?

  • ログイン機能: 一度ログインしたら、ページ移動しても「ログイン状態を維持」するために必要。
  • ショッピングカート機能: 複数の商品を選択した際に、「カートの中身」を保持するために必要。
  • 個別のユーザー情報の管理: ページをまたいで、**「このユーザーは誰?」**をサーバーが認識するために必要。

3. セッションの仕組み

  1. ユーザーがWebサイトにアクセスすると、サーバーが「セッションID」を発行します。
  2. セッションIDはクッキー(Cookie)としてブラウザに送信されます。
  3. サーバーはセッションIDを使って、そのユーザー専用の情報(ユーザーID、カート情報など)を管理します。

イメージ図

[ブラウザ] ---- セッションID送信 ----> [サーバー]

[サーバー] --- ユーザー情報を保存 ---> [メモリ/DB]


4. セッションとCookieの違い

項目セッションクッキー
保存場所サーバー側クライアント(ブラウザ)
データのサイズ小さなデータ(IDだけ)クライアントにデータ全体を保存
安全性高い(サーバーで管理)低い(クライアントで管理)
持続時間セッションが切れるまで(一定時間)ユーザーが削除するまで
代表的な用途ログイン情報、ショッピングカートサイトの言語やテーマの保存

5. Java (Servlet & JSP) でのセッションの使い方


1. セッションの開始と取得

サーブレットでセッションを取得する方法です。

HttpSession session = request.getSession();
  • request.getSession(): セッションがなければ新しいセッションを作成し、セッションがあればそれを取得します。

2. セッションに値を保存する

セッションにデータを追加する方法(ログインしたユーザーの情報をセッションに保存する例)

// ユーザーの名前をセッションに保存する
session.setAttribute("userName", "山田太郎");
  • setAttribute(key, value): セッションにデータを追加するメソッド
  • 例えば、userName という名前で、山田太郎 というデータがセッションに保存されます。

3. セッションから値を取得する

保存されたデータを別のページやサーブレットから取得する方法です。

// セッションからユーザー名を取得
String userName = (String) session.getAttribute("userName");
  • getAttribute(key): セッションに保存されたデータをkeyを使って取得します。

4. セッションから値を削除する

ログアウトする際などに使う方法です。

// セッションの "userName" だけを削除する
session.removeAttribute("userName");
</code>
  • removeAttribute(key): 指定したデータ(key)だけを削除します。

5. セッションを完全に削除する(ログアウトの時)

ログアウト機能では、セッション全体を破棄する必要があります。

// セッションを破棄(全データを削除)
session.invalidate();
  • invalidate(): セッション全体を削除するメソッド。
  • ログアウト時にはこのメソッドを使います

6. 実際の使い方の例


ログイン機能のセッションの使い方

1. ログイン処理(UserLoginServlet.java)

package controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/login")
public class UserLoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // ログインの成功を仮定
        if ("admin".equals(username) && "password".equals(password)) {
            HttpSession session = request.getSession();
            session.setAttribute("userName", username); // セッションにユーザー情報を保存
            response.sendRedirect("home.jsp");
        } else {
            response.sendRedirect("login.jsp?error=1");
        }
    }
}

2. ログイン後のホーム画面(home.jsp)

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head><title>ホーム画面</title></head>
<body>
    <h1>ホーム画面</h1>

    <c:if test="${not empty sessionScope.userName}">
        <p>ようこそ、${sessionScope.userName}さん!</p>
        <a href="logout">ログアウト</a>
    </c:if>

    <c:if test="${empty sessionScope.userName}">
        <p>ログインしていません。</p>
        <a href="login.jsp">ログイン</a>
    </c:if>
</body>
</html>

3. ログアウト処理(LogoutServlet.java)

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.invalidate(); // セッションを完全に破棄
        response.sendRedirect("login.jsp");
    }
}

7. セッションの注意点

注意点説明
セッションの有効期限セッションは一定時間が経つと自動で切れます(通常は30分)。サーバーの web.xml で設定可能です。
セッションのサイズに注意大量のデータをセッションに入れるのはNG(DBに保存すべき)。
インスタンス変数を使わないサーブレットのインスタンス変数は共有されるため、必ずセッションを使いましょう。
ログアウトの処理を忘れないログアウト時はsession.invalidate() でセッションを削除する。

8. まとめ

機能使い方
セッションの開始HttpSession session = request.getSession();
データを追加session.setAttribute("key", value);
データを取得String value = (String) session.getAttribute("key");
データの削除session.removeAttribute("key");
ログアウト処理session.invalidate();

良かったらフォローお願いします

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です