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

Spring MVC 中 Session 與 Model 機制深度解析:@SessionAttributes 原理與最佳實踐

     編輯:Java 綜合教學

Spring MVC 中 Session 與 Model 機制深度解析

Spring MVC 提供兩種使用 Session 的方式:直接注入 HttpSession、或使用 @SessionAttributes 註解。本文重點剖析註解方式的底層原理與常見誤區。

@SessionAttributes 核心原理

  1. 寫入階段:Controller 方法將屬性放入 Model(如 model.addAttribute("userId", 123)),若類上標註 @SessionAttributes("userId"),框架會在視圖渲染後自動將該屬性複製到 Session 中。
  2. 讀取階段:後續請求進入同樣標註該註解的 Controller 時,框架會在調用處理方法前,從 Session 中取出 userId 並預填充到 Model 中,方法參數可直接通過 @ModelAttribute("userId") 或 Map 獲取。
  3. 作用域隔離:未標註該註解的 Controller 無法自動獲取 Session 中的該屬性,需手動從 HttpSession 取值。

清除機制

註解本身不提供清除 API,必須注入 HttpSession 手動移除:

@RequestMapping("/logout")
public String logout(HttpSession session) {
    session.removeAttribute("userId"); // 對應 @SessionAttributes 的值
    return "redirect:/login";
}
也可調用 SessionStatus.setComplete() 標記會話結束,框架會清除所有 @SessionAttributes 聲明的屬性。

Model vs HttpServletRequest 區別

維度ModelHttpServletRequest
定位視圖渲染數據容器客戶端請求信息載體
生命週期當前請求(含轉發)當前請求
清理時機視圖渲染完成後自動清空請求結束自動銷毀
視圖取值OGNL/EL 表達式直接取值需 request.getAttribute()

設計初衷:HttpServletRequest 職責單一——承載請求參數、Header 等客戶端信息,不應承擔「模型數據傳遞給視圖」的職責。Model 專為模型-視圖解耦設計,渲染後自動清理,避免污染請求域。

最佳實踐建議

  • 優先使用 Model/ModelAndView 傳遞視圖數據,保持 Controller 純淨。
  • @SessionAttributes 適用於「多步驟表單、向導式流程」等跨請求共享少量數據場景。
  • 大量/敏感數據仍建議顯式操作 HttpSession,便於精確控制生命週期。
  • 集群環境下確保 Session 複製/集中存儲(Redis),否則 @SessionAttributes 失效。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved