Spring MVC 中怎么使用 `@SessionAttributes` 传递会话数据

千伟同学_4926

千伟同学_4926

2026-08-07

929人浏览

原创

@sessionattributes用于在同controller的多次请求间临时共享指定模型属性,需声明、添加、清理三步操作,适用于分步表单等场景,不跨controller生效且要求对象可序列化。

spring mvc 中怎么使用 `@sessionattributes` 传递会话数据

@SessionAttributes 是 Spring MVC 提供的用于在多个请求之间**临时共享模型属性**的注解,它不是用来操作 HttpSession 的底层 API,而是对“模型属性”做会话级缓存的声明式支持。它的核心作用是:让某些 当前控制器内使用的 Model 属性 在后续同控制器的请求中自动从 session 恢复,避免重复绑定或查询。

什么时候该用 @SessionAttributes?

适用于同一 Controller 内、连续几步操作(如表单分步提交、向导流程)中需要暂存中间数据的场景。例如:

  • 用户填写注册表单第一页(姓名、邮箱),跳转到第二页(密码、确认密码),需要保留前页输入;
  • 购物车添加商品后,进入结算页,仍需访问购物车对象;
  • 编辑实体时先查出对象放入 model,后续 POST 请求更新时希望直接绑定到同一个对象实例。

注意:它只对当前 Controller 有效,且仅管理被明确声明的模型属性名,不会影响其他 Controller 或全局 session。

基本用法:声明 + 添加 + 清理

三步缺一不可:

JavaStoryDevelop
JavaStoryDevelop

你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在

下载
  • 声明:在 Controller 类上加 @SessionAttributes({"user", "cart"}),指定要托管的模型属性名(String 数组);
  • 添加:在 handler 方法中通过 model.addAttribute("user", user) 放入对应 key 的对象 —— Spring 会自动同步进 session;
  • 清理:调用 sessionStatus.setComplete()(传入 SessionStatus 参数),Spring 会在本次请求结束后移除这些属性。

示例:

@Controller
@SessionAttributes("userInfo")
public class UserController {

    @GetMapping("/step1")
    public String showStep1(Model model) {
        model.addAttribute("userInfo", new UserInfo()); // 自动存入 session
        return "step1";
    }

    @PostMapping("/step2")
    public String handleStep2(@ModelAttribute UserInfo userInfo, 
                              BindingResult result, 
                              SessionStatus status) {
        if (result.hasErrors()) return "step1";
        // 处理第二步逻辑...
        status.setComplete(); // ✅ 清理 userInfo,后续请求不再从 session 恢复
        return "success";
    }
}

常见误区和注意事项

  • 不是所有 Model 属性都会进 session:只有名字匹配 @SessionAttributes 列表的才会被托管;
  • 不等于直接操作 HttpSession:你不能用 request.getSession().getAttribute("userInfo") 取值 —— Spring 封装了存储位置(可能是 session,也可能是其他策略),应始终通过 @ModelAttribute 绑定或 Model 获取;
  • 类型必须可序列化:被托管的对象类需实现 Serializable,否则可能在集群或重启时出错;
  • 不要跨 Controller 共享:另一个 Controller 即使也写了 @SessionAttributes("userInfo"),也无法自动获取前一个 Controller 存的值 —— 它只负责自己范围内的恢复逻辑。

替代方案对比

如果需要更灵活的会话控制(比如跨 Controller、手动增删、设置超时),应直接使用 HttpSession:

  • session.setAttribute("key", obj) / session.getAttribute("key");
  • 搭配 @Scope("session") 的 Bean(适合整个 session 生命周期的组件);
  • 使用 Spring Session(支持 Redis、JDBC 等外置 session 存储)。

@SessionAttributes 是轻量、约定式、面向流程的会话建模工具,适合“本 Controller 内短生命周期”的模型延续 —— 用对场景,代码更干净;滥用或误解,反而增加调试成本。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java session spring mvc

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2671

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

477

25

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

20

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

20

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

20

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

20

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

20

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习