カテゴリ: Servlet 更新日: 2026/06/09

JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本

HttpSession
HttpSession

先生と生徒の会話形式で理解しよう

生徒

「Javaのサーブレットでセッションを管理する方法ってありますか?」

先生

「はい、JavaではHttpSessionインターフェースを使ってセッションを管理することができます。これにより、ユーザーごとのデータをセッションごとに保存できますよ。」

生徒

「セッションって何ですか?」

先生

「セッションとは、サーバーとクライアントの間で情報を一時的に保存する仕組みです。例えば、ログイン状態を保持したり、ショッピングカートの情報を管理する際に利用します。」

1. HttpSessionとは?

「1. HttpSessionとは?」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

1. HttpSessionとは?
1. HttpSessionとは?

HttpSessionは、サーバー側に「ユーザーごとの一時的な保管箱」を用意する仕組みです。ページをまたいで値を覚えておけるので、同じ人の操作を続きとして扱えます。クラスは主にjavax.servlet.http(近年はjakarta.servlet.http)に含まれ、キーと値(nameobject)の形でデータを預けます。

イメージは次のとおりです。

  1. 最初のアクセスでセッションが作られる(必要に応じて自動)。
  2. ログイン名やカート合計などを保存する。
  3. 次のリクエストでも同じ人として取り出せる。

主な利用例:

  • ユーザーのログイン状態を維持する
  • ショッピングカートのデータを保持する
  • フォーム入力情報を一時的に保存する

未経験者向けの超シンプル例(「セッションがあるか」「IDは何か」だけ確認):


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

public class WhatIsSessionServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // 既存がなければ新しく作成して取得
    HttpSession session = request.getSession(); 
    // サーバーが発行した、あなた専用の識別子(後の説明に繋がります)
    String id = session.getId(); 
    response.getWriter().println("あなたのセッションID: " + id);
  }
}
  

この例では、サーバー側にあなた用の「保管箱」が用意され、その箱に紐づくIDが表示されます。次のページでも同じIDなら、同じ保管箱から値を取り出せます。

2. HttpSessionの主なメソッド

2. HttpSessionの主なメソッド
2. HttpSessionの主なメソッド

HttpSessionは「キー(String)と値(何でもOKなObject)」でデータを預ける入れ物です。ここでは基本の操作だけに絞って、初学者でも迷わない使い方を丁寧に押さえます。

  • setAttribute(String name, Object value):セッションにデータを保存(同じ名前なら上書き)。
  • getAttribute(String name):保存したデータを取り出す(無いときはnull)。
  • removeAttribute(String name):指定した名前のデータを削除。
  • invalidate():セッションそのものを破棄(以後は使えません)。

まずは超シンプルなカウンター例:ページを開くたびに数字が増えます。


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

public class SessionMethodsDemoServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    HttpSession session = request.getSession(); // なければ作成して取得
    // 1) 取り出し(初回は null なので 0 扱い)
    Integer count = (Integer) session.getAttribute("count");
    if (count == null) count = 0;

    // 2) 保存(上書き)
    session.setAttribute("count", count + 1);

    // 3) 一時データの削除例(存在しなくてもOK)
    session.removeAttribute("tempMessage");

    response.getWriter().println("今のカウント: " + session.getAttribute("count"));
  }
}
  

セッションを終わらせたいとき(例:確認用の簡単な破棄ボタン):


// 例: /session-demo?end=true にアクセスしたらセッションを破棄
if ("true".equals(request.getParameter("end"))) {
  HttpSession session = request.getSession(false); // 既存があるときだけ
  if (session != null) session.invalidate();       // 完全に破棄
  response.getWriter().println("セッションを終了しました。");
  return;
}
  

よくあるつまずきgetAttributeの戻り値はObjectなので、取り出すときは型キャストが必要です(上の例ではInteger)。また、保存されていない名前を取り出すとnullなので、必ずnullチェックを入れておくと安全です。

3. サンプルコードで使い方を確認

3. サンプルコードで使い方を確認
3. サンプルコードで使い方を確認

以下のコードは、HttpSessionインターフェースを使ってセッションにデータを保存し、それを取得する方法を示しています。


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

public class SessionExampleServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // セッションを取得または新規作成
        HttpSession session = request.getSession();

        // セッションにデータを保存
        session.setAttribute("username", "John Doe");

        // セッションからデータを取得
        String username = (String) session.getAttribute("username");

        // 結果を出力
        response.getWriter().println("セッションに保存されたユーザー名: " + username);
    }
}

4. 実行結果

「4. 実行結果」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

4. 実行結果
4. 実行結果

セッションに保存されたユーザー名: John Doe

5. セッションの有効期限と注意点

5. セッションの有効期限と注意点
5. セッションの有効期限と注意点

HttpSessionにはデフォルトで30分の有効期限が設定されています。必要に応じて以下のように有効期限を設定できます。


session.setMaxInactiveInterval(60 * 10); // 10分に設定

また、セッションの利用には以下の点に注意してください。

  • セッションに大量のデータを保存すると、サーバーの負荷が増加します。
  • セッションIDの盗難を防ぐため、HTTPSを使用することが推奨されます。
  • 不要になったセッションはinvalidate()メソッドで明示的に無効化しましょう。

6. セッションIDとCookie(JSESSIONID)の仕組み

6. セッションIDとCookie(JSESSIONID)の仕組み
6. セッションIDとCookie(JSESSIONID)の仕組み

サーブレットでは、クライアントを識別するためにJSESSIONIDというCookieが使われます。ブラウザにCookieが使えない場合はURLリライティングでセッションIDを付与します(encodeURL()を使用)。

  • Cookie方式:サーバーがSet-Cookie: JSESSIONID=...を返し、以後のリクエストで同じIDが送られます。
  • URLリライティング方式:リンクやリダイレクト先に;jsessionid=...を付加します。

// リンク生成時に必ず encodeURL() を通して URL リライティングに対応
String link = response.encodeURL(request.getContextPath() + "/cart");
response.getWriter().println("<a href='" + link + "'>カートを見る</a>");
  

なお、セキュリティのためセッションIDは推測困難な値が生成され、後述の対策と組み合わせて安全性を高めます。

7. セッションのライフサイクルとリスナー(HttpSessionListener)

「7. セッションのライフサイクルとリスナー(HttpSessionListener)」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

7. セッションのライフサイクルとリスナー(HttpSessionListener)
7. セッションのライフサイクルとリスナー(HttpSessionListener)

HttpSessionは作成・無効化のタイミングでイベントが発生します。HttpSessionListenerを使うと、アクティブユーザー数の計測や後処理が可能です。


import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;
import java.util.concurrent.atomic.AtomicInteger;

@WebListener
public class SessionCounterListener implements HttpSessionListener {
    private static final AtomicInteger ACTIVE = new AtomicInteger(0);

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        int count = ACTIVE.incrementAndGet();
        System.out.println("Session created: " + se.getSession().getId() + " / active=" + count);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        int count = ACTIVE.decrementAndGet();
        System.out.println("Session destroyed: " + se.getSession().getId() + " / active=" + count);
    }
}
  

属性の追加・削除を監視したい場合はHttpSessionAttributeListenerも利用できます。

8. セキュリティ対策:セッション固定攻撃・ハイジャック防止

8. セキュリティ対策:セッション固定攻撃・ハイジャック防止
8. セキュリティ対策:セッション固定攻撃・ハイジャック防止

ログイン直後にセッションIDを更新し、Cookie属性も適切に設定します。


// 認証成功直後のセッション固定攻撃対策
// 既存セッションを引き継いだままIDのみを安全に再発行(Servlet 3.1+)
request.changeSessionId();

// 重要:必要に応じて属性を再設定(ログインユーザー情報など)
request.getSession().setAttribute("loginUser", user);
  


<session-config>
  <cookie-config>
    <http-only>true</http-only>
    <secure>true</secure>
    <name>JSESSIONID</name>
  </cookie-config>
  <session-timeout>30</session-timeout> 
</session-config>
  
  • HttpOnly:JavaScriptからCookie取得を防止
  • Secure:HTTPS通信時のみCookie送信
  • IDローテーションchangeSessionId()で固定攻撃を防ぐ

9. よくある実装パターン:ログイン保持とログアウト

9. よくある実装パターン:ログイン保持とログアウト
9. よくある実装パターン:ログイン保持とログアウト

ログイン済みかを判定する際はgetSession(false)で既存セッションのみ取得し、未ログイン時の自動生成を避けます。ログアウト時はinvalidate()で完全に破棄します。


public class AuthUtil {
    public static boolean isLoggedIn(HttpServletRequest request) {
        var session = request.getSession(false); // 既存セッションのみ
        return session != null && session.getAttribute("loginUser") != null;
    }
}

// ログアウトサーブレット例
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    var session = request.getSession(false);
    if (session != null) {
        session.invalidate(); // セッション完全破棄
    }
    response.sendRedirect(request.getContextPath() + "/login?logout");
}
  

フォーム遷移でセッションを使う場合は、保存するデータを最小限にし、巨大オブジェクトは避けましょう。分散環境では属性をSerializableにしておくとレプリケーションに有利です。

まとめ

「まとめ」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

まとめ
まとめ

この記事では、HttpSessionについて詳しく解説しました。セッションは、サーバーとクライアントの間で一時的にデータを保存する仕組みで、ログイン状態やショッピングカートの情報を管理する際に非常に便利です。
HttpSessionの主な機能としては、セッションへのデータ保存、データ取得、データ削除、セッションの無効化などがあります。これらのメソッドを活用することで、ユーザー体験を向上させる機能を簡単に実装できます。
また、セッションの有効期限の設定やHTTPSの利用など、セキュリティやパフォーマンス面での注意も重要です。

以下に、セッションを無効化する例を追加します。


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

public class InvalidateSessionExample extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // セッションを取得
        HttpSession session = request.getSession(false);
        if (session != null) {
            // セッションを無効化
            session.invalidate();
        }
        response.getWriter().println("セッションが無効化されました。");
    }
}

この例では、ユーザーがログアウトする際にセッションを無効化する方法を示しています。不要なセッションを適切に無効化することで、サーバーのリソースを節約できます。

先生と生徒の振り返り会話

生徒

「セッションを使うと、ユーザーごとにデータを保持できることがわかりました。セッションの無効化も大事なんですね。」

先生

「そうです。セッションの無効化は、ユーザーがログアウトする際や、不要になったセッションを削除する際に必要です。また、セキュリティを考慮してHTTPSを使用することも忘れないようにしましょう。」

生徒

「セッションにデータを保存して取り出す仕組みを実際にコードで試してみたいと思います!」

先生

「ぜひ試してください!セッションはWebアプリケーション開発の基礎なので、しっかりと理解しておくと、より高度な開発にも役立ちますよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JavaのHttpSessionは何のために使うのですか?

HttpSessionは、Javaのサーブレットでセッション管理を行うためのインターフェースです。例えば、ユーザーのログイン状態を保持したり、ショッピングカートのデータを保存したりするのに利用されます。

HttpSessionの主なメソッドにはどんなものがありますか?

主なメソッドには、setAttributeでデータを保存、getAttributeでデータを取得、removeAttributeでデータを削除、invalidateでセッションを無効化するものがあります。

Javaでセッションの有効期限を変更する方法を教えてください。

HttpSessionのsetMaxInactiveIntervalメソッドを使うと、セッションの有効期限を変更できます。たとえば、10分に設定するには60秒×10を引数に指定します。

HttpSessionを使うときの注意点は何ですか?

セッションに大量のデータを保存するとサーバーの負荷が増加するため、保存するデータは必要最低限にしましょう。また、セッションIDの盗難を防ぐため、HTTPSを使用することが推奨されます。

セッションIDとは何ですか?

セッションIDは、クライアントとサーバーの間でセッションを識別するための一意の識別子です。これにより、サーバーはクライアントごとのデータを識別して管理できます。

セッションを明示的に無効化するタイミングはいつですか?

セッションを明示的に無効化するタイミングは、ユーザーがログアウトしたときや、不要になったセッションを削除する必要があるときです。

HttpSessionは必ず使う必要がありますか?

いいえ、セッション管理が必要ない場合は必ずしも使用する必要はありません。ただし、ログイン機能や一時的なデータ保存が必要な場合は非常に便利です。

セッションとクッキーの違いは何ですか?

セッションはサーバー側でデータを管理しますが、クッキーはクライアント側でデータを保存します。セッションの方がセキュリティ面で優れていますが、サーバーのリソースを消費します。

Javaでセッションがタイムアウトするとどうなりますか?

セッションがタイムアウトすると、サーバー側でセッションが破棄され、セッションに保存されていたデータが失われます。再度セッションを作成する必要があります。

HttpSessionの代わりに使用できるものはありますか?

HttpSessionの代わりに、Webアプリケーションフレームワーク(例えばSpring)で提供されるセッション管理機能を使用することも可能です。また、クッキーやトークンを利用した認証方式も選択肢の一つです。

JSESSIONIDは毎回のリクエストで変わるのですか?

通常は同一セッション中は変わりません。ログイン直後のIDローテーション(changeSessionId())やタイムアウト後の再作成、サーバー再起動などのタイミングで新しいIDになります。

SameSite属性はどう設定すべきですか?

通常のWebアプリならLaxで十分です。外部ドメインをまたぐSSOや埋め込みが必要ならNoneSecureをセットにします。挙動はブラウザ依存のため、要件に合わせて明示設定しましょう。

サブドメイン間でセッションを共有できますか?

CookieのDomain=.example.comで共有可能ですが、アプリ側のセッションストアも共有(クラスタリングや外部ストア)する必要があります。セキュリティ上の影響も踏まえて最小範囲で設定してください。

URLに;jsessionidが付くのを避ける方法は?

ブラウザでCookieが有効であることを前提に、URLリライティングを無効化します。コンテナ設定や<tracking-mode>COOKIE</tracking-mode>web.xml)で制御し、リンク生成時のencodeURL()依存を減らします。
カテゴリの一覧へ
新着記事
New1
Java
JavaのNotSerializableExceptionを完全解説!初心者でも理解できるシリアライズと例外処理
新規投稿
New2
Spring
Springの@Repositoryアノテーションの使い方を徹底解説!初心者でもわかるSpringフレームワークのデータアクセス
更新記事
New3
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
更新記事
New4
Java
Javaのjava.mathとBigIntegerのintValueメソッドを完全解説!初心者でもわかる数値変換の基本
更新記事
人気記事
No.1
Java&Spring記事人気No1
Servlet
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.2
Java&Spring記事人気No2
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.3
Java&Spring記事人気No3
JSP
JSPでフォームを表示して入力を受け取る基本手順をやさしく解説!初心者向けフォーム処理の入門ガイド
No.4
Java&Spring記事人気No4
Spring
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.5
Java&Spring記事人気No5
JSP
JSPでCSSやJSを読み込む基本!外部ファイルのパス指定に注意しよう
No.6
Java&Spring記事人気No6
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.7
Java&Spring記事人気No7
Spring
Spring Data JPA入門!findAll()やfindBy**()の使い方などデータベース操作の基礎を学ぶ
No.8
Java&Spring記事人気No8
JSP
JSPでif文・for文を使う方法!初心者でもわかるJavaとの違いと使い方