Spring学习笔记_48——@SessionAttribute

时间:2024-11-25 14:41:25

Spring学习笔记_45——@ControllerAdvice
Spring学习笔记_46——@InitBinder
Spring学习笔记_47——@RequestAttribute


文章目录

    • @[toc]
      • 1. 介绍
      • 2. 场景
      • 3. 源码
      • 4. Demo
      • 5. 补充
        • 5.1 Model
        • 5.2 Session
        • 5.3 Cookie
        • 5.4 总结


1. 介绍

@SessionAttribute注解作用于处理器类上,它允许开发者有选择地指定哪些模型属性需要存储到HTTP会话(Session)中,以便在多个请求之间共享这些数据。这通常用于需要跨多个页面或请求保持数据一致性的场景,如多步骤表单处理或向导式用户界面。

@SessionAttribute注解指定属性名称就可以直接从当前Session的作用域中获取指定属性名称的值,

2. 场景

在基于SpringMVC或者SpringBoot开发Web应用程序时,如果不想通过HttpSession的getAttribute()方法从Session作用域中获取数据,而是直接通过指定的属性名称获取Session作用域中的属性值,从而实现与Servlet API进行解耦的目的

  1. 预填充表单数据:当用户访问一个表单页面时,可能需要从用户的会话中获取一些信息来预填充表单。例如,如果用户已经登录,可以从会话中获取用户名或用户ID等信息,并将其显示在表单中。
  2. 跨请求的数据共享:在一个多步骤的流程中(如一个多页的向导),可以将数据存储在会话中,然后在每个步骤之间传递这些数据,而不需要每次都通过表单或URL传递。
  3. 减少数据库查询:对于那些在多个请求中频繁使用的数据,可以考虑将它们存储在会话中,以减少对数据库的访问次数,提高应用性能。

3. 源码

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SessionAttribute {

    // String类型的属性,用于指定在Session作用域中的属性的名称
    @AliasFor("name")
    String value() default "";

    // String类型的属性,作用与value属性相同
    @AliasFor("value")
    String name() default "";
    
    // boolean类型的属性,表示请求作用域中的属性是否必需
    // true: 必需
    // false: 非必需
    // 如果为true,则当前请求域中没有对应的属性,就会抛出异常。
    // 默认值为true
    boolean required() default true;

}

4. Demo

在第一个请求中想Session中添加一个属性

@PostMapping("/login")
public String handleLogin(@RequestParam String username, @RequestParam String password, HttpSession session) {
    // 假设这里进行了验证
    User user = userService.findByUsername(username);
    if (user != null && user.getPassword().equals(password)) {
        session.setAttribute("user", user); // 将用户对象添加到会话中
        return "redirect:/home";
    } else {
        return "loginError";
    }
}

在第另一个Controller中使用

@Controller
@RequestMapping("/profile")
public class ProfileController {

    @GetMapping
    public String showProfile(@SessionAttribute("user") User user, Model model) {
        model.addAttribute("user", user); // 将用户对象添加到模型中
        return "profile"; // 返回视图名称
    }

    @PostMapping
    public String updateProfile(@SessionAttribute("user") User user, @ModelAttribute User updatedUser, Model model) {
        // 更新用户的某些属性
        userService.updateUser(user.getId(), updatedUser);
        model.addAttribute("user", updatedUser); // 更新后的用户对象
        return "profile"; // 返回视图名称
    }
}

5. 补充

5.1 Model

定义

Model 是一个接口,用于封装要传递给视图的数据。在 Spring MVC 中,Model 通常是一个 Map,其中键是字符串,值是任意对象。控制器方法可以将数据添加到 Model 中,这些数据随后会被传递给视图进行渲染。

用途

  • 数据传递:控制器方法将数据添加到 Model 中,以便视图可以使用这些数据进行渲染。
  • 视图渲染:视图引擎(如 Thymeleaf、JSP 等)会从 Model 中提取数据并将其渲染成 HTML 页面。
5.2 Session

定义

Session 是一个 HTTP 会话,用于在多个请求之间保持状态。每个客户端连接到服务器时,服务器会创建一个唯一的会话标识符(通常是 cookies 中的一个 JSESSIONID),并将会话数据存储在服务器端。

用途

  • 状态管理:在多个请求之间保持用户的状态信息,如用户身份、购物车内容等。
  • 数据共享:在不同控制器方法之间共享数据,而不需要每次都通过 URL 或表单传递。
5.3 Cookie

定义

Cookie 是一种在客户端浏览器中存储小量数据的技术。每个 cookie 都有一个名称和一个值,并且可以设置过期时间、路径等属性。

用途

  • 客户端存储:在客户端浏览器中存储少量数据,如用户偏好设置、会话标识符等。
  • 跟踪用户:通过 cookie 可以跟踪用户的行为,如记录用户的登录状态、购物车内容等。
5.4 总结
  • Model:用于在控制器和视图之间传递数据。
  • Session:用于在多个请求之间保持状态信息,数据存储在服务器端。
  • Cookie:用于在客户端浏览器中存储少量数据,数据存储在客户端。