カテゴリ: Servlet 更新日: 2026/01/09
PR
独学でJavaを学んでいる方向け
「実務レベルに到達できるか不安」「1人だと詰まることが多い」場合は、 実践重視で学べる環境を一度確認しておくのも一つの手です。
EBAエデュケーション |学習内容・サポートを見る

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

HttpSession
HttpSession

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

生徒

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

先生

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

生徒

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

先生

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

1. HttpSessionとは?

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

HttpSessionインターフェースは、javax.servlet.httpパッケージに属し、サーバー側でセッションデータを管理するための機能を提供します。
セッションはクライアントごとに生成され、ユーザーが特定のアクションを実行した際にサーバーとやり取りされるデータを一時的に保存します。

主に以下のような場面で利用されます。

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

2. HttpSessionの主なメソッド

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

HttpSessionインターフェースには、セッションを操作するためのさまざまなメソッドが用意されています。主なメソッドは以下の通りです。

  • setAttribute(String name, Object value): セッションにデータを保存します。
  • getAttribute(String name): セッションからデータを取得します。
  • removeAttribute(String name): セッションからデータを削除します。
  • invalidate(): セッションを無効にします。
PR

将来を見据えて、+αのスキルを身につけたい方へ

JavaやLinuxを学んでいても、「このままで市場価値は上がるのか」 「キャリアの選択肢を広げたい」と感じる方は少なくありません。

AIを学ぶならアイデミープレミアム

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. 実行結果

セッションに保存されたユーザー名: 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)

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

サーブレットやJSPの基礎を体系的に理解したい人には、 定番の入門書がこちらです。

スッキリわかるサーブレット&JSP入門をAmazonで見る

※ Amazonアソシエイト・プログラムを利用しています

カテゴリの一覧へ
新着記事
PR

JavaやLinuxの検証環境に
低コストで使えるVPS

JavaのVectorクラスの使い方を完全ガイド!初心者でもわかるコレクションの基本
Spring Bootのディレクトリ構成を完全ガイド!初心者向けにjava・resources・static・templatesの役割を解説
Spring Boot + IntelliJ IDEAの始め方を完全ガイド!JDK設定・起動構成・デバッグまで解説
Gradle vs Maven どっちを選ぶ?Spring Bootの依存管理・ビルド設定の基本
PR 未経験からITエンジニアを目指す方へ

Javaを学んでいるけど、「このまま未経験で就職できるか不安」という20代向け。 学歴不問・無料サポートの就職支援という選択肢があります。

Tamesy |無料で面談予約
人気記事
No.1
Java&Spring記事人気No1
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
JavaのArrayListクラスとgetメソッドを完全解説!初心者でもわかるリストの要素取得
No.3
Java&Spring記事人気No3
JavaのIntegerクラスparseIntメソッド完全ガイド!初心者でもわかる文字列から数値変換
No.4
Java&Spring記事人気No4
JavaのEnumクラスのordinalメソッドを徹底解説!初心者でもわかる列挙型の順序番号
No.5
Java&Spring記事人気No5
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.6
Java&Spring記事人気No6
Spring BootのJakarta移行ガイド!初心者向けjavax→jakarta変更ポイント徹底解説
No.7
Java&Spring記事人気No7
Spring BootのMultipartFile入門:ファイルアップロード・ダウンロードの実装方法と制限設定
No.8
Java&Spring記事人気No8
EL式の基本構文まとめ!${}で使う書き方のルールを解説
PR

ローカルPCに依存しない開発環境という選択肢

Java・Linuxの検証や学習環境を、クラウド上ですぐに用意できます。

Java入門

Javaの基礎を体系的に学びたい場合は、文法だけでなく 「なぜそう書くのか」まで丁寧に解説されているため、 初心者でも理解しやすい定番の1冊です。

スッキリわかるJava入門 第4版

※ 紙の書籍・電子書籍どちらでも購入できます

Java実践

ジェネリクス、enum、シールクラスなどの型設計から、 関数型プログラミング(ラムダ式・Stream API)、 JVM制御やリフレクション、外部ライブラリの活用までを扱っており、 「Javaを使えるレベル」へ進むための内容が網羅されています。

スッキリわかるJava入門 実践編 第4版

※ 紙の書籍・電子書籍どちらでも購入できます

Spring入門

Spring Frameworkの全体像から、 Webアプリ開発で必要となる主要機能までを 体系的に解説している定番の入門書です。

Spring徹底入門 第2版 Spring FrameworkによるJavaアプリケーション開発

※ 紙の書籍・電子書籍どちらでも購入できます

PR 実務経験のあるエンジニア向け

Javaなどの実務経験があり、次のキャリアを検討している方向け。 IT・ゲーム業界に特化した転職支援サービスという選択肢もあります。

転職ボックス |IT・ゲーム業界専門