首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring MVC @SessionAttributes 存儲 Session 正確用法與常見坑

     編輯:程式設計綜合問答

原始碼問題

User uuser = (User) request.getSession().getAttribute("user"); // ❌ 可能為 null

`@SessionAttributes("user")` 將模型屬性 **"user"** 存入 Session,**但只有在方法返回 ModelAndView 且模型包含 "user" 時才會寫入**。原碼中 `model.addAttribute("user", user1)` 正確,但隨後立即從 `request.getSession()` 讀取,**同一請求內 Session 尚未完成寫入**,導致取不到。

正確用法

  1. 控制器方法參數直接注入 Session** (推薦):
    @RequestMapping("/login")
    public String login(@RequestParam String uname, @RequestParam String upass,
                        Model model, HttpSession session) {
        User user = userService.selectLogin(uname, upass);
        if (user != null) {
            model.addAttribute("user", user); // 觸發 @SessionAttributes 寫入
            // 當前請求直接用 user 變數,無需從 session 讀
            return "redirect:/home";
        }
        return "login";
    }
    
  2. 後續請求讀取**:
    @RequestMapping("/profile")
    public String profile(@ModelAttribute("user") User user) { // 自動從 Session 取出
        return "profile";
    }
    
  3. 清除 Session 屬性**:
    @RequestMapping("/logout")
    public String logout(SessionStatus status) {
        status.setComplete(); // 移除 @SessionAttributes 宣告的所有屬性
        return "redirect:/login";
    }
    

關鍵點總結

  • `@SessionAttributes` 僅管理**模型屬性**,不直接操作 `HttpSession`。
  • 同請求寫入後**不可立即從 HttpSession 讀取**,應用模型變數或下一請求用 `@ModelAttribute` 取出。
  • 配合 `SessionStatus.setComplete()` 登出清理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved