Spring boot セッション管理をしよう

2025 年 2 月 25 日 by marukor

はじめに

Springにはいくつかのセッションの管理の方法があったので、その中のよく使う方法を紹介します。

バージョン

springframework-version 4.3.30

java-version 1.8

HttpSession を使用したセッション管理

これはSpringのデフォルトのセッション管理方法になります。

コントローラー

セッションに値を保存・取得するシンプルな Controller を作成します。

import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/session")
public class SessionController {

    @GetMapping("/set")
    public String setSession(HttpSession session) {
        session.setAttribute("username", "user123");
        return "Session set: username = user123";
    }

    @GetMapping("/get")
    public String getSession(HttpSession session) {
        String username = (String) session.getAttribute("username");
        return username != null ? "Session value: " + username : "No session found";
    }

    @GetMapping("/invalidate")
    public String invalidateSession(HttpSession session) {
        session.invalidate();
        return "Session invalidated";
    }
}

動作確認

  1. /session/set にアクセス → username をセッションに保存
  2. /session/get にアクセス → 保存した username を取得
  3. /session/invalidate にアクセス → セッションを破棄

@SessionScope を使った方法

Springの @SessionScope を使うと、セッションごとに管理されるBean を作成できます。
この方法は 複数のコントローラー間でセッション情報を共有 するのに適しています。

セッションスコープのBean

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

@Component
@Scope("session")  // セッションスコープで管理
public class SessionUser implements Serializable {
    private String username;

    public String getUsername() {
        return username;
    }

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

コントローラー

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/session-bean")
public class SessionScopeController {

    private final SessionUser sessionUser;

    public SessionScopeController(SessionUser sessionUser) {
        this.sessionUser = sessionUser;
    }

    @GetMapping("/set/{name}")
    public String setSession(@PathVariable String name) {
        sessionUser.setUsername(name);  // セッションBeanに保存
        return "SessionBean set: " + name;
    }

    @GetMapping("/get")
    public String getSession() {
        return sessionUser.getUsername() != null 
            ? "SessionBean value: " + sessionUser.getUsername() 
            : "No session found";
    }

    @GetMapping("/clear")
    public String clearSession() {
        sessionUser.setUsername(null);  // セッションデータをクリア
        return "SessionBean cleared";
    }
}

動作

  • GET /session-bean/set/Alice → “Alice” をセッションBeanに保存
  • GET /session-bean/get → “SessionBean value: Alice” が返る
  • GET /session-bean/clear → セッションデータをクリア

@Component の意味

  • Springの管理対象Bean(コンポーネント)として登録する
  • @Component を付けることで、このクラスは SpringのDIコンテナによって管理される
  • @Autowired などで他のクラスに 依存注入 できるようになる

@Scope(“session”) の意味

  • このBeanのスコープ(生存期間)を「セッション単位」にする
  • 各 HTTPセッションごとに1つのインスタンスが作成される
  • 異なるセッション間では別のインスタンス になる

@SessionAttributes を使った方法

@SessionAttributes を使うと、特定のモデル属性をセッションに保持できます。
この方法は Controllerごとにセッションを管理 するのに適しています。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@Controller
@SessionAttributes("username")  // "username" をセッションに保存
@RequestMapping("/session")
public class SessionAttributeController {

    @GetMapping("/set/{name}")
    public String setSession(@PathVariable String name, Model model) {
        model.addAttribute("username", name);  // セッションに保存
        return "Session set: " + name;
    }

    @GetMapping("/get")
    @ResponseBody
    public String getSession(@ModelAttribute("username") String username) {
        return "Session value: " + username;
    }

    @GetMapping("/clear")
    public String clearSession(SessionStatus status) {
        status.setComplete();  // セッションをクリア
        return "Session cleared";
    }
}

動作

  • GET /session/set/John → “John” をセッションに保存
  • GET /session/get → “Session value: John” が返る
  • GET /session/clear → セッションをクリア

まとめ

セッションの管理方法は調べればもっと出てきますが、私の周りのプロジェクトでは大体仕様されているセッションはこれくらいです。実際に製造する際に、セッションのスコープを意識して作ることができればシステムのパフォーマンスも向上するので是非そういった部分にもこだわって作りこんでいこうと思いました。

タグ: ,

TrackBack