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

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

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

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

生徒

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

先生

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

生徒

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

先生

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

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

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

Spring Frameworkでは、セッションスコープを使用することでユーザーごとにデータを保持できます。ログイン情報やショッピングカートの内容といった情報を、ユーザーごとに区別して管理できるため、ユーザー体験が向上します。セッション管理を活用することで、信頼性の高いアプリケーションの構築が可能です。

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

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

Springには@SessionScopeというアノテーションがあり、このアノテーションを使うことで、特定のBeanをセッションスコープに設定することが可能です。また、セッションスコープのBeanをコントローラなどで利用する際は@Autowiredで自動的に注入することができます。例として、ユーザー情報をセッションに保持するUserSessionクラスを作成してみましょう。


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

@Component
@SessionScope
public class UserSession {
    private String username;

    public String getUsername() {
        return username;
    }

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

この例では、UserSessionクラスがセッションスコープに設定されており、usernameを保持します。このクラスを使用すると、ユーザーがページ遷移してもデータが保持されます。

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

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

コントローラでセッションスコープのBeanを使用するためには、@Autowiredを使用してUserSessionクラスを注入します。これにより、セッションスコープのUserSessionクラスにアクセスし、データを管理できるようになります。


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

@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";
    }
}

上記のコードでは、setUsernameメソッドでセッションにusernameを設定し、getUsernameメソッドでセッションのusernameを取得してモデルに追加しています。これにより、セッションを通じてユーザー名を管理できます。

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

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

SpringのThymeleafを使って、セッションのデータを表示する方法について説明します。Thymeleafでは、セッションスコープのBeanのインスタンスに直接アクセスすることができます。以下のテンプレート例では、セッションの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>
</body>
</html>

このテンプレートでは、@UserSession.usernameという形式でセッションスコープのBeanに直接アクセスしてusernameを表示しています。これにより、現在のセッションに保存されているユーザー名が画面に表示されます。

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として管理されるため、どのコントローラからも同じインスタンスにアクセスできます。
カテゴリの一覧へ
新着記事
JavaのHttpServletResponseWrapperを完全解説!初心者でも理解できるレスポンス処理のしくみ
JavaのScannerクラスの使い方を徹底解説!初心者でも簡単に学べる入力処理
JavaのArrayListクラスとaddメソッドを完全解説!初心者でもわかるリスト操作
Javaの@Idアノテーションを徹底解説!初心者でもわかるデータベースとの連携方法
人気記事
No.1
Java&Spring記事人気No1
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Javaのラムダ式で配列を扱う!Arrays.streamの基本と注意点を初心者向けに解説
No.3
Java&Spring記事人気No3
JavaのRuntimeExceptionを完全解説!初心者でもわかるjava.langパッケージの基礎
No.4
Java&Spring記事人気No4
JavaのBigDecimalクラスcompareToメソッド完全ガイド!初心者でもわかる大小比較の基本
No.5
Java&Spring記事人気No5
JavaのIntegerクラスの使い方を完全ガイド!初心者でもわかる整数操作
No.6
Java&Spring記事人気No6
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.7
Java&Spring記事人気No7
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法
No.8
Java&Spring記事人気No8
JSPとは何か?初心者向けにできること・仕組み・特徴をやさしく解説