カテゴリ: Spring 更新日: 2026/08/13

Spring Frameworkでセッション管理をする!@SessionScopeの使い方を覚えよう!

Springのセッション管理
Springのセッション管理

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

生徒

「Springでセッションを使ったデータ管理って、どうやるんですか?」

先生

「Springでは、セッションスコープを使ってユーザーごとのデータを保持できる仕組みが用意されています。特に@SessionScopeアノテーションを活用することで簡単にセッション管理ができますよ。」

生徒

「@SessionScopeってどう使うんですか?」

先生

「それでは、@SessionScopeや@Autowiredを使ったセッション操作について見ていきましょう!」

1. Spring Frameworkのセッション管理とは?

1. Spring Frameworkのセッション管理とは?
1. Spring Frameworkのセッション管理とは?

Spring Frameworkには、ユーザーごとに情報を記憶しておく「セッション」という仕組みがあります。簡単に言うと、Webサイトを利用している間だけ保持されるメモのようなもので、ページを移動しても値が消えずに残ってくれます。

例えば「ログイン状態を維持したまま別のページに移動できる」「ショッピングカートの商品が消えない」といった動きは、このセッション管理によって実現できます。毎回データを受け渡す必要がないため、ユーザーにとってストレスの少ない快適なWebアプリになります。

実際に、とても簡単なサンプルを見てみましょう。セッションに「ユーザー名」を保存して表示するだけの仕組みでも、セッションがどう役立つのかイメージが掴みやすいです。


@Controller
public class SampleController {

    @GetMapping("/set")
    public String set(HttpSession session) {
        session.setAttribute("name", "Taro");
        return "setComplete";
    }

    @GetMapping("/show")
    public String show(HttpSession session, Model model) {
        String name = (String) session.getAttribute("name");
        model.addAttribute("username", name);
        return "display";
    }
}
    

このサンプルでは、「/set」にアクセスするとセッションへ名前を保存し、「/show」にアクセスすると保存した名前を表示できます。一度入れた情報がページ間で維持されることが、セッション管理の基本的なイメージです。

2. @SessionScopeと@Autowiredを使ったセッション管理

2. @SessionScopeと@Autowiredを使ったセッション管理
2. @SessionScopeと@Autowiredを使ったセッション管理

Springでは、クラスに@SessionScopeを付けるだけで「このオブジェクトはユーザーごとに保持しておいてね」という設定ができます。つまり、同じユーザーがページを移動しても、値が残ったままになる仕組みです。ログイン中の名前や、途中まで入力したフォーム内容を覚えておく場面でよく使われます。

さらに、セッションに保存したいBeanはコントローラ側で@Autowiredを付けるだけで利用できるので、「セッションへ保存して→取り出す」という処理を意識しなくて良いのもポイントです。

まずは、ユーザー名を保持するシンプルなBeanを作ってみましょう。


import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.SessionScope;

@Component            // Spring管理のBeanとして登録
@SessionScope         // セッションごとにインスタンスを保持
public class UserSession {
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

このクラスがセッションスコープになることで、例えばコントローラからsetUsername("Taro")と実行すれば、そのユーザーだけが「Taro」というデータを保持したまま画面を移動できます。ページをまたいで値が残る仕組みが、自動で実現できるわけです。

手動でHttpSessionに値を入れたり取り出したりするよりも、Javaのオブジェクトとして扱えるので、初心者でも扱いやすいのが特徴です。

3. コントローラでセッションスコープのBeanを使用

3. コントローラでセッションスコープのBeanを使用
3. コントローラでセッションスコープのBeanを使用

作成したUserSessionは、コントローラで@Autowiredを付けるだけで利用できます。難しい設定は不要で、普通のフィールドと同じように扱えるため、初めてセッションを触る人でも迷いません。たとえば、ボタンを押したときにセッションへ名前を保存し、別の画面でその名前を表示する処理を考えてみましょう。


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.ui.Model;

@Controller
public class SessionController {

    @Autowired
    private UserSession userSession; // セッション用のBeanをそのまま利用

    @GetMapping("/setUsername")
    public String setUsername() {
        userSession.setUsername("SpringUser"); // セッションに値を保存
        return "usernameSet";                  // 表示用テンプレートへ遷移
    }

    @GetMapping("/getUsername")
    public String getUsername(Model model) {
        model.addAttribute("username", userSession.getUsername());
        return "displayUsername";
    }
}

上記コードでは、「/setUsername」にアクセスした瞬間にセッションへユーザー名を保存し、「/getUsername」でその値を画面に渡しています。セッションはユーザーごとに維持されるので、別ページへ移動しても値が消えません。もしログイン中のユーザー名や、カート情報などを保持したい場合も同じ考え方で使えます。

ポイントは、開発者がHttpSessionを直接操作しなくても良いことです。Javaのオブジェクトとして自然に扱えるため、後からメソッドを増やしたり複数の値を持たせたりしても混乱しません。日常的な業務アプリでも非常によく使われる書き方です。

4. Thymeleafでセッションのデータを表示する方法

4. Thymeleafでセッションのデータを表示する方法
4. Thymeleafでセッションのデータを表示する方法

コントローラでセッションへ保存した値は、Thymeleafを使うことで画面に簡単に表示できます。ここでは、先ほどのUserSessionに保存されたusernameを表示してみましょう。テンプレート側では特別な書き方は必要なく、変数式${ }を使えばそのまま参照できます。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Session Example</title>
</head>
<body>
    <!-- セッション中のユーザー名を表示 -->
    <h1 th:text="'Hello, ' + ${@userSession.username} + '!'">Hello, User!</h1>

    <!-- 値が未設定の場合の表示例 -->
    <p th:if="${@userSession.username == null}">まだ名前が登録されていません。</p>
</body>
</html>

ポイントは、ThymeleafではURL式@{ }ではなく、変数式${@userSession.username}を使ってBeanへアクセスすることです。コントローラが値をセットしていれば、画面を開くだけで挨拶メッセージが動的に変わります。

もし値が入っていなければ、th:ifで別のコメントを表示することも可能です。テンプレート側で処理を書きすぎず、「表示に専念できる」というのがThymeleafのメリットです。実際のログイン画面やマイページでも、この仕組みがそのまま応用できます。

5. セッション管理の注意点

5. セッション管理の注意点
5. セッション管理の注意点

セッション管理の使用にあたっては以下の点に注意しましょう:

  • セッションに大量のデータを保持しないようにし、必要最小限の情報に留める。
  • セッションデータの暗号化などを行い、機密データの漏洩を防ぐ。
  • セッションの有効期限を設定し、セッションが長期間放置されないようにする。

これらの点を考慮することで、より安全で効率的なセッション管理を実現できます。

6. @SessionScopeと@SessionAttributesの違いと選び方

6. @SessionScopeと@SessionAttributesの違いと選び方
6. @SessionScopeと@SessionAttributesの違いと選び方

@SessionScopeは「Bean自体」をセッション単位で管理するのに対し、@SessionAttributesは「コントローラのモデル属性」をセッションへ退避します。機能は似ていますが、適用範囲と責務が異なります。

  • @SessionScope:業務ロジックを持つ状態オブジェクト(カート、ウィザード状態など)をBeanとして保持したいときに有効。
  • @SessionAttributes:同一コントローラ内でフォーム入力をページ間で引き回すなど、モデル属性の一時保存に向く。
  • 選び方:複数コントローラから横断的に使うなら@SessionScope、特定コントローラの画面遷移だけなら@SessionAttributes

7. ライフサイクル:生成・破棄とセッション無効化の実装

7. ライフサイクル:生成・破棄とセッション無効化の実装
7. ライフサイクル:生成・破棄とセッション無効化の実装

@SessionScopeのBeanは初回アクセス時にセッションごとに生成され、セッションが無効化されると破棄されます。手動でセッションを終了したい場合は、ログアウト処理などでセッションを無効化しましょう。


import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class LogoutController {

    @PostMapping("/logout")
    public String logout(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate(); // セッション破棄 → @SessionScopeのBeanも破棄
        }
        return "redirect:/";
    }
}
  

Spring Security を使う場合は、ログアウト機能とあわせてセッション無効化が自動で行われる設定を利用すると安全です(セッション固定化対策と併用すると効果的)。

8. ThymeleafでセッションスコープBeanを正しく参照する

8. ThymeleafでセッションスコープBeanを正しく参照する
8. ThymeleafでセッションスコープBeanを正しく参照する

ThymeleafではURL式の@{...}ではなく、変数式${...}で値を表示します。@SessionScopeのBean名がuserSessionであれば、次のように書けます。


<h1 th:text="'Hello, ' + ${@userSession.username} + '!'">Hello, User!</h1>
  

ポイント:

  • ${@beanName}でSpring Bean(ここではセッションスコープ)にアクセス可能。
  • モデルへ詰めた場合は${username}HttpSession属性を直接読むなら${session.userSession.username}など、用途で使い分けます。

9. 分散環境のコツ:シリアライズとSpring Sessionの活用

9. 分散環境のコツ:シリアライズとSpring Sessionの活用
9. 分散環境のコツ:シリアライズとSpring Sessionの活用

複数サーバー構成や外部ストア(Redisなど)にセッションを置く場合、セッションに入るオブジェクトはシリアライズ可能である必要があります。@SessionScopeのBeanにもSerializable実装を付けましょう。


import java.io.Serializable;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.SessionScope;

@Component
@SessionScope
public class UserSession implements Serializable {
    private static final long serialVersionUID = 1L;
    private String username;
    // getter / setter
}
  
  • 非推奨パターン:DBコネクションや巨大なコレクションなど、シリアライズに不向きなリソースを保持する。
  • Spring Session:アプリ再起動やスケールアウト時もセッションを共有でき、@SessionScopeのBeanも透過的に扱えるようになります。

まとめ

まとめ
まとめ

この記事では、Spring Frameworkでのセッション管理について詳しく解説しました。セッションスコープを活用することで、ユーザーごとのデータを保持し、アプリケーション全体で共有する仕組みを構築できます。特に、@SessionScopeアノテーションと@Autowiredを組み合わせた実装方法を学びました。

セッションスコープを使用することで、ユーザーのログイン情報やショッピングカートの内容などを効率的に管理できます。また、SpringのThymeleafを利用すれば、セッションデータを簡単に表示することができ、ユーザー体験を向上させることが可能です。

セッションの管理にはいくつかの注意点があります。例えば、セッションに保存するデータ量を最小限にすることや、セッションデータの暗号化を行うことが重要です。また、セッションの有効期限を適切に設定することで、リソースの無駄を防ぐことができます。

以下に、この記事で説明した内容をまとめたサンプルコードを掲載します。セッションスコープの基本的な使い方を復習し、実際のプロジェクトに応用してみてください。


<!-- セッションスコープのクラス -->
@Component
@SessionScope
public class UserSession {
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

<!-- コントローラー -->
@Controller
public class SessionController {

    @Autowired
    private UserSession userSession;

    @GetMapping("/setUsername")
    public String setUsername() {
        userSession.setUsername("SpringUser");
        return "usernameSet";
    }

    @GetMapping("/getUsername")
    public String getUsername(Model model) {
        model.addAttribute("username", userSession.getUsername());
        return "displayUsername";
    }
}

<!-- Thymeleafテンプレート -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Session Management Example</title>
</head>
<body>
    <h1 th:text="'Hello, ' + @{UserSession.username} + '!'>Hello, User!</h1>
</body>
</html>

このサンプルコードでは、セッションスコープのクラスを定義し、コントローラーでユーザー情報を設定・取得する流れを解説しました。また、Thymeleafを使ったデータ表示方法も紹介しました。

セッションスコープを利用することで、ユーザーの状態を管理しやすくなり、より良いユーザー体験を提供できます。この記事を参考に、セッション管理を取り入れたアプリケーションを構築してみてください。

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

生徒

「@SessionScopeを使うと、ユーザーごとにデータを保持できるんですね。とても便利です!」

先生

「その通りです。セッションスコープを使うと、ログイン情報や一時的なデータを簡単に管理できます。ただし、セッション管理には注意点もありますよ。」

生徒

「例えばどんな注意点がありますか?」

先生

「セッションに大量のデータを保持しないことや、有効期限を設定することが重要です。また、機密情報を扱う場合は暗号化を忘れないようにしましょう。」

生徒

「わかりました!セッションを安全に管理するために気を付けます。」

先生

「いいですね。次は、セッション管理と併せてクッキーの使い方についても学んでみましょう。」

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

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

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

@SessionScopeはどのような場面で使うべきですか?

@SessionScopeは、ログイン情報やショッピングカートなど、ユーザーごとに異なるデータを保持したい場合に使います。セッションスコープにデータを保存することで、ユーザーの状態を管理しやすくなります。

Spring FrameworkでセッションスコープのBeanを定義するにはどうすればいいですか?

セッションスコープのBeanを定義するには、@Componentアノテーションと@SessionScopeアノテーションをクラスに付与します。これにより、そのBeanはセッションスコープで管理されます。

セッションスコープのデータにアクセスする方法を教えてください。

セッションスコープのデータにアクセスするには、@Autowiredを使用してセッションスコープのBeanをコントローラーに注入します。その後、Beanのメソッドを使用してデータを取得または設定します。

セッションに保存されたデータをThymeleafで表示する方法は何ですか?

Thymeleafでは、セッションスコープのBeanに直接アクセスしてデータを表示できます。例えば、@{UserSession.username}の形式でセッションデータを参照できます。

セッションデータの暗号化はどのように行えばいいですか?

セッションデータの暗号化は、Spring Securityを利用するのが一般的です。セッションストレージやCookieに保存されるデータを暗号化し、不正アクセスを防止します。

セッションスコープのBeanに保存できるデータ量に制限はありますか?

セッションスコープに保存するデータ量に明確な制限はありませんが、大量のデータを保存するとメモリを圧迫し、パフォーマンスに悪影響を及ぼす可能性があります。必要最小限のデータに留めることが推奨されます。

Spring Bootでセッションの有効期限を設定する方法を教えてください。

Spring Bootでは、application.propertiesapplication.ymlファイルでセッションの有効期限を設定できます。例えば、server.servlet.session.timeout=30mのように記述します。

複数のコントローラーで同じセッションスコープのBeanを共有できますか?

はい、セッションスコープのBeanは同じセッション内で共有されます。複数のコントローラーで同じBeanを@Autowiredを使用して利用できます。

セッションが切れるとセッションスコープのデータはどうなりますか?

セッションが切れると、セッションスコープに保存されていたデータも破棄されます。そのため、必要に応じてデータをデータベースなどの永続ストレージに保存する対策が必要です。

Spring Frameworkでセッションスコープを使わずにユーザー情報を管理する方法はありますか?

セッションスコープを使用しない場合、CookieやJWT(JSON Web Token)を使用してユーザー情報を管理する方法があります。これらはセッションレスなアプローチとして有効です。

@SessionScopeと@SessionAttributesを同時に使っても良いですか?

技術的には併用できますが、同じデータを両方で持つと「正」となる保存先が曖昧になります。横断的に使う状態は@SessionScopeに集約し、特定コントローラ内の一時的な入力保持だけ@SessionAttributesを使うのがおすすめです。

複数コントローラから同じセッション状態を扱うならどちらを選ぶべき?

@SessionScopeが適しています。Beanとして管理されるため、どのコントローラからも同じインスタンスにアクセスできます。

フォームウィザードの入力値を画面遷移で引き回す場合は?

同一コントローラ内で完結するウィザードは@SessionAttributesが簡単です。画面遷移の最後でSessionStatus#setComplete()を呼び、不要になったら確実に破棄します。

@SessionAttributesのデータだけを破棄する方法は?

ハンドラ内でSessionStatus#setComplete()を呼び出します。これにより対象コントローラのセッション属性がクリアされます(セッション自体は残ります)。
カテゴリの一覧へ
新着記事
New1
Thymeleaf
Thymeleafの#mapsユーティリティとは?初心者向けマップ操作ガイド
更新記事
New2
Thymeleaf
Thymeleafの#arraysユーティリティとは?初心者向け配列操作ガイド
更新記事
New3
Thymeleaf
Thymeleafの#strings.sizeメソッドとは?初心者向け文字列の長さ取得ガイド
更新記事
New4
Thymeleaf
Thymeleafの#datesユーティリティとは?初心者向け日付操作ガイド
更新記事
人気記事
No.1
Java&Spring記事人気No1
Java
Javaのクラスとインスタンス化、コンストラクタの使い方完全ガイド!初心者でもわかるオブジェクト指向の基礎
No.2
Java&Spring記事人気No2
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.3
Java&Spring記事人気No3
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.4
Java&Spring記事人気No4
Java
JavaのDateクラスの使い方を完全ガイド!初心者でもわかる日付操作
No.5
Java&Spring記事人気No5
Java
JavaのExceptionクラスを完全解説!初心者でも理解できる例外処理の基本
No.6
Java&Spring記事人気No6
Java
Java開発環境「Eclipse(Pleiades)」のインストール方法とメリットを初心者向けに解説
No.7
Java&Spring記事人気No7
Thymeleaf
Thymeleafのth:hrefの使い方を全解説。初心者でも完璧に理解できるガイド
No.8
Java&Spring記事人気No8
Thymeleaf
Thymeleafのth:valueの使い方を解説!フォーム入力値を保持したり動的に表示する方法