Spring MVC 操作會話屬性詳解(@SessionAttributes 與 @SessionAttribute)

Spring MVC 操作會話屬性詳解(@SessionAttributes 與 @SessionAttribute)


1. 核心注解對比
注解作用范圍功能
@SessionAttributes類級別聲明控制器中需要持久化的模型屬性(存入 HttpSession
@SessionAttribute方法參數/返回值顯式綁定方法參數或返回值到 HttpSession已棄用,推薦使用 @SessionAttributes

2. @SessionAttributes 詳解

作用:在控制器類上標注,聲明哪些模型屬性需要被保存到會話中,跨請求共享。


2.1 基本用法
@Controller
@SessionAttributes({ "user", "cart" }) // 保存名為 "user" 和 "cart" 的屬性
public class UserController {// 方法中添加到 Model 的屬性會被自動保存到會話
}

2.2 參數選項
屬性作用
value指定要持久化的模型屬性名稱(字符串數組)
types指定要持久化的屬性類型(Class 對象數組),滿足類型即會被保存

示例:按類型保存所有 Cart 類型的屬性:

@SessionAttributes(types = { Cart.class })

2.3 生命周期管理
  • 添加屬性:通過 Model 接口添加到模型:

    @GetMapping("/login")
    public String login(@ModelAttribute User user, Model model) {model.addAttribute("user", user); // 自動持久化到會話return "redirect:/home";
    }
    
  • 移除屬性:通過 SessionStatus 接口:

    @PostMapping("/logout")
    public String logout(SessionStatus status) {status.setComplete(); // 清除所有 @SessionAttributes 標記的屬性return "redirect:/login";
    }
    

3. @SessionAttribute 詳解

作用:直接從 HttpSession 獲取屬性作為方法參數(已棄用,建議改用 @SessionAttributes)。


3.1 基本用法
@GetMapping("/profile")
public String showProfile(@SessionAttribute("user") User user, // 直接從會話獲取 "user" 屬性Model model
) {model.addAttribute("user", user);return "profile";
}

3.2 注意事項
  • 已棄用:Spring 官方推薦通過 @SessionAttributes 管理會話屬性,而非直接使用 @SessionAttribute
  • 替代方案:通過 @Autowired 注入 HttpSession 對象:
    @Autowired
    private HttpSession session;@GetMapping("/cart")
    public String getCart() {Cart cart = (Cart) session.getAttribute("cart");// ...
    }
    

4. 完整代碼示例

4.1 使用 @SessionAttributes 的控制器
@Controller
@SessionAttributes("user") // 持久化 "user" 屬性
public class UserController {@GetMapping("/login")public String loginPage() {return "login";}@PostMapping("/login")public String loginSubmit(@ModelAttribute User user,Model model) {model.addAttribute("user", user); // 自動保存到會話return "redirect:/home";}@GetMapping("/home")public String home(@ModelAttribute("user") User user, // 從會話獲取Model model) {model.addAttribute("user", user); // 保持會話屬性return "home";}@GetMapping("/logout")public String logout(SessionStatus status) {status.setComplete(); // 清除 "user" 屬性return "redirect:/login";}
}

4.2 使用 HttpSession 直接操作
@Controller
public class CartController {@Autowiredprivate HttpSession session;@GetMapping("/addToCart/{productId}")public String addToCart(@PathVariable String productId) {Cart cart = (Cart) session.getAttribute("cart");if (cart == null) {cart = new Cart();session.setAttribute("cart", cart); // 手動保存}cart.addProduct(productId);return "redirect:/cart";}
}

5. 對比表格:@SessionAttributes 與 @SessionAttribute
對比項@SessionAttributes@SessionAttribute
作用范圍類級別(聲明持久化規則)方法參數/返回值(直接綁定)
推薦程度推薦(符合 Spring MVC 設計模式)已棄用(建議改用 @SessionAttributes
生命周期管理自動管理(通過 ModelSessionStatus需手動操作會話(不推薦直接使用)
靈活性支持按名稱或類型持久化僅支持按名稱獲取參數

6. 常見問題

Q1:如何清除單個 @SessionAttributes 屬性?

A:通過 SessionStatussetComplete() 會清除所有標記的屬性。若需清除單個屬性,需直接操作 HttpSession

session.removeAttribute("user");
Q2:如何避免會話屬性內存泄漏?

A:

  1. 在用戶退出時顯式清除屬性(如調用 logout 方法)。
  2. 配置 HttpSession 的超時時間(web.xml 或 Spring Security)。
  3. 對敏感數據及時清理。
Q3:@SessionAttributes 是否支持類型匹配?

A:是的,通過 types 參數指定類型,例如:

@SessionAttributes(types = { Cart.class, User.class })
Q4:能否在 RESTful API 中使用會話屬性?

A:可以,但需注意:

  • REST 通常要求無狀態,會話屬性可能破壞這一原則。
  • 若需跨請求共享數據,建議改用 Token 或數據庫存儲。

7. 總結
  • 推薦實踐
    1. 使用 @SessionAttributes 聲明需要持久化的模型屬性,通過 Model 接口操作。
    2. 避免直接使用 @SessionAttribute(已棄用),改用 HttpSession@SessionAttributes
    3. 對會話屬性的生命周期進行嚴格管理,避免內存泄漏。

通過合理使用會話屬性,可以實現用戶狀態的跨請求保持(如登錄狀態、購物車),但需權衡會話存儲的性能和安全性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900677.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900677.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python字典實戰: 三大管理系統開發指南(班級+會議+購物車)(附源碼)

目錄 摘要 一、班級管理系統(含成績模塊) 1. 功能概述 2. 完整代碼與解析 3. 代碼解析與亮點 二、會議管理系統 1. 功能概述 2. 完整代碼 3. 代碼解析與亮點 三、購物車管理系統 1. 功能概述 2. 完整代碼 3. 代碼解析與亮點 四、總結與擴…

北京自在科技:讓萬物接入蘋果Find My網絡的″鑰匙匠″

在AirTag掀起全球防丟熱潮的今天,越來越多的第三方產品開始接入蘋果Find My網絡——從充電寶到電動車,從行李箱到保溫杯,用戶只需打開iPhone的「查找」App,就能實時定位這些物品。 北京自在科技有限責任公司早在蘋果推出Find My開…

Vue進行前端開發流程

一、創建vue項目 創建vue項目&#xff1a;先進入要操作的目錄下&#xff0c;注意本項目是用vue2開發的。 vue create vue項目名 二、項目開發 1.創建項目結構 2.開發功能模塊 主入口App.vue <template><div class"boss-app"><Header /><m…

網絡帶寬測速工具選擇指南iperf3 nttcp tcpburn jperf使用詳解

簡介 本文主要介紹內網&#xff08;局域網&#xff09;與外網&#xff08;互聯網&#xff09;的網絡帶寬測速工具下載地址、選擇指南、參數對比、基本使用。 測速工具快速選擇指南 測速工具下載地址 iperf 官網下載鏈接&#xff1a;iperf.fr/iperf-download.php該鏈接提供了不…

微軟的 Copilot 現在可以瀏覽網頁并為您執行操作

在慶祝其 50 歲生日之際&#xff0c;微軟正在向其人工智能驅動的 Copilot 聊天機器人傳授一些新技巧。 從 BASIC 到 AI&#xff0c;改變世界的公司&#xff1a;微軟 微軟表示&#xff0c;Copilot 現在可以在“大多數網站”上采取行動&#xff0c;使其能夠預訂門票、預訂餐廳等…

Docker學習--網絡相關命令

docker network 命令的作用&#xff1a; 用于管理 Docker 網絡。這些命令可以創建、列出、刪除和檢查網絡&#xff0c;幫助用戶在 Docker 容器之間建立通信。 常用命令&#xff1a; ①列出所有網絡&#xff1a; docker network ls。 輸出&#xff1a; NETWORK ID NA…

【Vue3知識】組件間通信的方式

組件間通信的方式 概述**1. 父子組件通信****父組件向子組件傳遞數據&#xff08;Props&#xff09;****子組件向父組件發送事件&#xff08;自定義事件&#xff09;** **2. 兄弟組件通信****通過父組件中轉****使用全局狀態管理&#xff08;如 Pinia 或 Vuex&#xff09;** **…

[藍橋杯] 挖礦(CC++雙語版)

題目鏈接 P10904 [藍橋杯 2024 省 C] 挖礦 - 洛谷 題目理解 我們可以將這道題中礦洞的位置理解成為一個坐標軸&#xff0c;以題目樣例繪出坐標軸&#xff1a; 樣例&#xff1a; 輸入的5為礦洞數量&#xff0c;4為可走的步數。第二行輸入是5個礦洞的坐標。輸出結果為在要求步數…

2025年Python的主要應用場景

李升偉 編譯 Python在2025年仍是最受歡迎和強大的編程語言之一。其簡潔易讀的語法以及龐大的庫生態系統&#xff0c;使其成為各行業開發者的首選。無論是構建復雜的數據管道&#xff0c;還是自動化重復性任務&#xff0c;Python都能提供廣泛的應用場景&#xff0c;以實現快速、…

fastapi完全離線環境(無外網)的訪問Swagger所做特殊處理

在互聯網環境中&#xff0c;只要 啟動FastAPI 服務運行在本地機器上&#xff0c;訪問 http://localhost:8000/docs&#xff08;Swagger UI&#xff09;就可以訪問到Swagger界面&#xff0c;但是在完全離線環境&#xff08;無外網&#xff09;下如何訪問Swagger頁面呢&#xff1…

Ubuntu 20.04 出現問號圖標且無法聯網 修復

在 Ubuntu 中遇到網絡連接問題&#xff08;如出現問號圖標且無法聯網&#xff09;&#xff0c;可以通過以下命令嘗試重啟網絡服務&#xff1a; 1. 推薦先修改DNS 編輯 -> 虛擬機網絡編輯器-> VMnet8 ->NAT 設置 -> DNS 設置 -> 設置DNS 服務器 DNS填什么 取決…

哈希表(開散列)的實現

目錄 引入 開散列的底層實現 哈希表的定義 哈希表的擴容 哈希表的插入 哈希表查找 哈希表的刪除 引入 接上一篇&#xff0c;我們使用了閉散列的方法解決了哈希沖突&#xff0c;此篇文章將會使用開散列的方式解決哈希沖突&#xff0c;后面對unordered_set和unordered_map的…

機器學習(八):K-Means聚類原理與實戰

聲明&#xff1a;未經允許禁止轉載與抄襲。 前言 k k k均值&#xff08; k k k-means&#xff09;聚類算法是一種經典的無監督聚類算法&#xff0c;本文將深入解析其理論原理&#xff0c;并在真是數據集上進行算法實踐&#xff0c;話不多說&#xff0c;請看下文。 算法原理 …

判斷矩陣A和矩陣B是否相似?

【例題1】 &#xff08;1&#xff09;方法1 &#xff08;2&#xff09;方法2 &#xff08;3&#xff09;方法3 好題\(^o^)/~ 【注意】當二次多項式有重根時&#xff0c;即判別式為零&#xff0c;此時二次多項式是完全平方。

【10】搭建k8s集群系列(二進制部署)之安裝Dashboard和CoreDNS

一、部署Dashboard 1.1、創建kubernetes-dashboard.yaml文件 完整的yaml配置文件信息如下&#xff1a; # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in …

大數據技術與Scala

集合高級函數 過濾 通過條件篩選集合元素&#xff0c;返回新集合。 映射 對每個元素應用函數&#xff0c;生成新集集合 扁平化 將嵌套集合展平為單層集合。 扁平化映射 先映射后展平&#xff0c;常用于拆分字符串。 分組 按規則將元素分組為Map結構。 歸約 …

數據驅動可視化實戰:圖表狐精準生成圖表的完整數據范式

一、數據輸入黃金法則 圖表狐 - AI圖表生成工具,在線數據可視化要求數據描述必須包含三個核心要素&#xff1a; [主體對象] [量化指標] [維度劃分] 錯誤示例 ?&#xff1a; "展示各部門銷售額對比" 正確示例 ?&#xff1a; "2023年Q1-Q4各部門銷售額&a…

蒼穹外賣(1)-部分環境配置(git、數據庫)

首先配置git 創建好本地倉庫之后 把項目弄到遠程倉庫里去 先進行提交 &#xff0c;后進行推送 &#xff0c;然后gitee創建一個倉庫 把這個url復制好 推送后會出來一個 點擊推送&#xff0c;會讓你輸入gitee賬號密碼&#xff0c;輸入自己的賬號密碼&#xff0c;就可以連接遠程倉…

Ubunut18.04 離線安裝MySQL 5.7.35

一、環境準備 1.1 官方下載MySQL5.7.35 完整包 1.2 上傳包 & 解壓 上傳包名稱是&#xff1a;mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle.tar # 切換到上傳目錄 cd /home/MySQL # 解壓&#xff1a; tar -xvf mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle…

Linux(CentOS10) gcc編譯

本例子摘自《鳥哥的linux私房菜-基礎學習第四版》 21.3 用make進行宏編譯 書中的代碼在本機器(版本見下&#xff09;編譯出錯&#xff0c;改正代碼后發布此文章&#xff1a; #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…