会话锦囊:揭示Spring MVC如何巧妙使用@SessionAttributes

@SessionAttributes

@SessionAttributes 是一个 SpringMVC 中的注解,它用于将特定的模型属性暂时存储在 HTTP 会话(session)中。当使用 SessionAttributes 注解时,被注解的模型属性可以在多个请求之间保持状态并共享数据。

使用 SessionAttributes 注解的步骤如下:

  1. 在控制器类上添加 @SessionAttributes 注解,指定需要存储在会话中的模型属性名。例如,@SessionAttributes(“user”) 表示将名为 “user” 的模型属性存储在会话中。
  2. 在处理方法(即带有 @RequestMapping 注解的方法)上,如果需要将模型属性添加到会话中,则可以使用 @ModelAttribute 注解。例如,@ModelAttribute(“user”) User user 表示将名为 “user” 的模型属性添加到会话中,并将其绑定到名为 “user” 的参数上。
  3. 访问该控制器的其他处理方法时,可以直接通过方法参数获取存储在会话中的模型属性。Spring 会自动从会话中获取该属性并将其注入到方法参数中。
  4. 当需要结束会话时,可以使用 @SessionAttributes 注解的 value 属性来指定需要清除的模型属性名。例如,@SessionAttributes(value = “user”, clearAfterCompletion = true) 表示在请求完成后清除名为 “user” 的模型属性。

SessionAttributes 的作用是在多个请求之间共享模型属性。这在某些情况下很有用,例如在多个页面间共享用户登录信息、购物车内容等。需要注意的是,存储在会话中的模型属性在整个会话期间都会存在,直到会话结束或被手动清除。

需要注意的是,SessionAttributes 注解只在 SpringMVC 的会话范围内起作用,并不会影响到 Servlet API 中的会话管理。因此,使用 SessionAttributes 时需要确保适当地处理会话的创建和销毁,以防止潜在的内存泄漏或其他问题。

package world.xuewei.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;


/**
 * 第一个控制器
 *
 * @author 薛伟
 * @since 2023/10/30 16:18
 */
@Controller
@SessionAttributes(value = {"name", "age", "address"})
public class SessionController {

    @RequestMapping("/session")
    public String session(Model model) {
        model.addAttribute("name", "张三");
        model.addAttribute("age", 25);
        model.addAttribute("sex", "Man");
        return "index";
    }
    
    /**
     * 清空当前 Session
     */
    @RequestMapping("/delSession")
    public String delSession(SessionStatus sessionStatus) {
        if (!sessionStatus.isComplete()) {
            sessionStatus.setComplete();
        }
        return "index";
    }
}