【SpringMVC】詳解cookie,session及實戰


目錄

1.前言

2.正文

2.1cookie與session概念

2.2返回cookie參數

2.3設置session

3.小結


1.前言

哈嘍大家好吖,今天繼續來給大家來分享SpringMVC的學習,今天主要帶來的是cookie與session的講解以及通過postman和fiddler來實戰,廢話不多說讓我們開始吧。

2.正文

2.1cookie與session概念

2.1.1.為什么需要 Cookie 和 Session?

HTTP 協議是無狀態的,服務器無法自動識別兩次請求是否來自同一個用戶。Cookie 和 Session 的作用就是在無狀態的 HTTP 協議基礎上,實現用戶身份識別和狀態保持

cookie是存儲在客戶端上的,session是存儲在服務器上的。cookie中存儲著sessionID。

2.1.2通俗理解

  • Cookie:像一張"會員卡",由服務器發放,瀏覽器保存,每次訪問時自動出示。

  • Session:像"保險箱",數據存儲在服務器,用戶通過"鑰匙"(Session ID)訪問自己的數據。

2.1.3cookie

1. 定義

Cookie 是服務器發送給瀏覽器的一小段文本信息(通常 4KB 以內),瀏覽器會保存并在后續請求中自動攜帶。

2. 工作原理

  1. 客戶端首次訪問服務器

  2. 服務器通過?Set-Cookie?響應頭下發 Cookie

  3. 瀏覽器后續請求自動通過?Cookie?請求頭發送 Cookie

2.1.4session

1. 定義

Session 是服務器端存儲的用戶會話數據,通過唯一的?Session ID?標識用戶,該 ID 通常通過 Cookie 傳遞。

2. 工作原理

  1. 客戶端首次訪問服務器

  2. 服務器創建 Session 并生成 Session ID

  3. 通過?Set-Cookie?下發 Session ID

  4. 瀏覽器后續請求攜帶 Session ID

  5. 服務器通過 Session ID 查找用戶數據

講解完基礎概念后我們就要開始寫代碼啦。?

2.2返回cookie參數

返回所有cookie:

@RequestMapping("/r11")  // 1. 定義路由映射
public String r11(HttpServletRequest request){  // 2. 方法參數注入// 3. 獲取 Cookie 數組Cookie[] cookies = request.getCookies();// 4. 非空檢查if(cookies != null){// 5. 遍歷 Cookie 數組for(Cookie cookie : cookies){// 6. 打印每個 Cookie 的名稱和值System.out.println(cookie.getName() + ":" + cookie.getValue());}}// 7. 返回響應return "返回所有cookie成功";
}

關鍵點詳解:

  1. @RequestMapping("/r11")

    • 這是一個 Spring MVC 注解

    • 表示當訪問?/r11?路徑時,會執行這個方法

    • 等價于?@GetMapping("/r11")(如果只處理 GET 請求)

  2. HttpServletRequest request

    • Spring 會自動注入當前 HTTP 請求對象

    • 該對象包含請求的所有信息(頭信息、參數、Cookie 等)

  3. request.getCookies()

    • 重要方法:從請求中獲取所有 Cookie

    • 返回?Cookie[]?數組(可能為 null)

    • 每個 Cookie 對象包含:

      • getName():獲取 Cookie 名稱

      • getValue():獲取 Cookie 值

      • 其他方法:getDomain(),?getPath(),?isHttpOnly()?等

  4. 非空檢查

    • 必須檢查?cookies != null

    • 如果瀏覽器沒有發送任何 Cookie,該方法返回 null

    • 不檢查會導致?NullPointerException

  5. Cookie 遍歷

    • 使用增強 for 循環遍歷數組

    • 每個?Cookie?對象代表一個鍵值對

在瀏覽器中打開該網頁,接下來通過fiddler抓包工具對其抓包:?

另外我們可以在postman設置cookies的值,格式是鍵值對。

通過postman也可以進行連接:


返回某個鍵值對的值:?

//返回cookie中單個鍵的值@RequestMapping("/r12")public String r12(@CookieValue ("name") String name){return "cookie該key的值" + name;}

?關鍵點詳解:

?

  1. @RequestMapping("/r12")

    • 定義了一個處理 HTTP 請求的端點

    • 默認支持所有 HTTP 方法(GET/POST等)

    • 建議明確指定方法類型,如?@GetMapping

  2. @CookieValue("name")

    • Spring MVC 提供的注解

    • 自動從請求的 Cookie 中提取名為 "name" 的值

    • 注入到方法參數?String name?中

  3. 返回值處理

    • 直接拼接字符串返回

2.3設置session

存儲session:

@RequestMapping("/r13")  // 1. 定義路由端點
public String setSession(HttpServletRequest request) {  // 2. 注入請求對象// 3. 獲取或創建 SessionHttpSession session = request.getSession();// 4. 存儲數據到 Sessionsession.setAttribute("name", "jerry");session.setAttribute("age", 20);// 5. 返回響應return "session設置成功";
}

關鍵點詳解

  1. request.getSession()

    • 核心方法,獲取當前會話的?HttpSession?對象

    • 重要特性

      • 如果 Session 不存在,會自動創建新 Session

      • 等價于?request.getSession(true)

      • 如果不想自動創建,可使用?request.getSession(false)

  2. setAttribute()?方法

    • 存儲數據的標準方式

    • 參數說明:

      void setAttribute(String name, Object value)
    • 可以存儲任何可序列化的 Java 對象

    • 相同 name 會覆蓋舊值

  3. Session 生命周期

    • 創建:第一次調用?getSession()?時

    • 銷毀:

      • 調用?session.invalidate()

      • 超過配置的超時時間(默認 30 分鐘)

      • 服務器重啟(如果使用內存存儲)

進行抓包:?


三種獲取session的方式:

方法一:通過 HttpServletRequest 獲取?

@RequestMapping("/r14")
public String getSession1(HttpServletRequest request) {// 獲取現有 Session,不自動創建新 SessionHttpSession session = request.getSession(false);if (session == null) {return "用戶未登錄";} else {// 從 Session 獲取屬性并強制類型轉換String name = (String) session.getAttribute("name");return "登錄用戶為:" + name;}
}
  1. request.getSession(false)

    • 參數?false?表示不自動創建新 Session

    • 如果 Session 不存在則返回?null

  2. 安全校驗:

    • 顯式檢查?session == null?處理未登錄情況

    • 避免直接操作可能為 null 的 Session

  3. 類型轉換:

    • getAttribute()?返回?Object?類型

    • 需要強制轉換為目標類型(這里是?String


?方法二:直接注入 HttpSession

@RequestMapping("/r15")
public String getSession2(HttpSession session) {// 直接使用注入的 Session 對象String name = (String) session.getAttribute("name");return "登錄用戶為: " + name;
}
  1. 自動注入:

    • Spring 會自動注入當前請求的?HttpSession

    • 等價于?request.getSession(true)

  2. 行為特點:

    • 如果 Session 不存在會自動創建新 Session

    • 可能導致不必要的 Session 創建

  3. 空值風險:

    • name?屬性可能不存在(返回?null


?方法三:使用 @SessionAttribute 注解

@RequestMapping("/r16")
public String getSession3(@SessionAttribute("name") String name) {return "登錄用戶為: " + name;
}
  1. 注解特性:

    • 直接從 Session 中提取指定屬性

    • 自動完成類型轉換(無需顯式強轉)

  2. 異常處理:

    • 如果屬性不存在會拋出?HttpSessionRequiredException

    • 可以使用?required = false?避免

  3. 與?@ModelAttribute?的區別:

    • @SessionAttribute?只從 Session 讀取

    • @ModelAttribute?會先檢查 Session 再檢查請求參數

方法特點適用場景是否自動創建 Session
r14通過 HttpServletRequest 獲取需要精確控制 Session 創建可控制 (false)
r15直接注入 HttpSession簡單讀取場景自動創建 (true)
r16使用 @SessionAttribute 注解需要特定 Session 屬性自動創建 (true)

3.小結

今天的分享到這里就結束了,喜歡的小伙伴點點贊點點關注,你的支持就是對我最大的鼓勵,大家加油!

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

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

相關文章

令狐沖的互聯網大廠Java面試之旅

場景描繪:互聯網大廠Java面試 在某個陽光明媚的上午,令狐沖來到了風清揚所在的互聯網大廠,準備迎接他的Java開發工程師面試。風清揚是一位以嚴謹和深厚技術功底著稱的面試官,令狐沖稍顯緊張,但他相信自己的準備。 第…

照片to谷歌地球/奧維地圖使用指南

軟件介紹 照片to谷歌地球/奧維地圖是一款由WTSolutions開發的跨平臺圖片處理工具,能夠將帶有GPS信息的照片導入Google Earth(谷歌地球)或奧維地圖。該軟件支持Windows、Mac、iOS、Linux和Android系統,無需下載安裝,直…

客戶端建立一個連接需要占用客戶端的端口嗎

客戶端建立TCP連接時需占用本地端口,具體機制如下: 一、端口占用的必要性 四元組唯一性? TCP連接通過?源IP、源端口、目標IP、目標端口?四元組唯一標識。客戶端發起連接時,必須綁定本地端口以完成通信標識。 動態端口分配? 客戶端操作…

【生存技能】ubuntu 24.04 如何pip install

目錄 原因解決方案說明 在接手一個新項目需要安裝python庫時彈出了以下提示: 原因 這個報錯是因為在ubuntu中嘗試直接使用 pip 安裝 Python 包到系統環境中,ubuntu 系統 出于穩定性考慮禁止了這種操作 這里的kali是因為這臺機器的用戶起名叫kali,我也不知道為什么…

智能時代下,水利安全員證如何引領行業變革?

當 5G、AI、物聯網等技術深度融入水利工程,傳統安全管理模式正經歷顛覆性變革。在這場智能化浪潮中,水利安全員證扮演著怎樣的角色?又將如何重塑行業人才需求格局? 水利工程智能化轉型對安全管理提出新挑戰。無人機巡檢、智能監測…

TDengine 在智能制造中的核心價值

簡介 智能制造與數據庫技術的深度融合,已成為現代工業技術進步的一個重要里程碑。隨著信息技術的飛速發展,智能制造已經成為推動工業轉型升級的關鍵動力。在這一進程中,數據庫技術扮演著不可或缺的角色,它不僅承載著海量的生產數…

微調ModernBERT為大型語言模型打造高效“過濾器”

ModernBERT(2024 年 12 月)是最近發布的小型語言模型,由 Answer.AI、LightOn 和 HuggingFace 共同開發。它利用了現代優化技術,如用于 8,192 token 上下文窗口的 RoPE 和 GeGLU layers,在保持效率的同時提升性能。jina…

電網拓撲分析:原理與應用

在現代電力系統中,電網拓撲分析是一項至關重要的技術,它為電力系統的安全、穩定和高效運行提供了堅實的基礎。電網拓撲描述了電力系統中各元件(如發電機、變壓器、輸電線路、負荷等)之間的連接關系,通過拓撲分析&#…

OSPF案例

拓撲圖: 要求: 1,R5為ISP,其上只能配置IP地址;R4作為企業邊界路由器, 出口公網地址需要通過PPP協議獲取,并進行chap認證 2,整個OSPF環境IP基于172.16.0.0/16劃分;…

2D橫板跳躍游戲筆記(查漏補缺ing...)

1.Compression(壓縮質量):可以改為None,不壓縮的效果最好,但占用內存 2.Filter Mode(過濾模式):可以選擇Point(no filter) 3.Pixels Per Unit:是…

MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL

ICLR 2025 spotlight paper 構建能夠在少量樣本下學習出優良策略的深度強化學習(RL)智能體一直是一個極具挑戰性的任務。為了提高樣本效率,近期的研究嘗試在每獲取一個新樣本后執行大量的梯度更新。盡管這種高更新-數據比(UTD&am…

Dia瀏覽器:AI驅動瀏覽網頁,究竟怎么樣?(含注冊申請體驗流程)

名人說:博觀而約取,厚積而薄發。——蘇軾《稼說送張琥》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 目錄 一、Dia瀏覽器簡介1. 什么是Dia瀏覽器2. 開發背景與公司簡介3. 與傳統瀏覽器的區別 …

SSL/TLS 證書與數字簽名:構建互聯網信任的詳解

在浩瀚的數字世界中,信任是安全通信的基石。當我們通過瀏覽器訪問一個 HTTPS 網站、進行在線支付,或者下載一個重要的軟件更新時,我們如何能確信自己正在與合法的、未被仿冒的對方進行交互?我們又如何能保證傳輸的數據沒有被中途竊…

近日部署跑通的若干多模態模型總結與論文概述

CLIP模型概述與落地測試 CLIP模型全稱是Contrastive Language-Image Pretraining??(對比語言圖像預訓練)。是OpenAI于2021年提出的多模態預訓練模型,通過對比學習對齊圖像和文本的表示,實現零樣本(zero-shot&#x…

Web3 初學者的第一個實戰項目:留言上鏈 DApp

目錄 📌 項目簡介:留言上鏈 DApp(MessageBoard DApp) 🧠 技術棧 🔶 1. Solidity 智能合約代碼(MessageBoard.sol) 🔷 2. 前端代碼(index.html script.js…

LeetCode 270:在二叉搜索樹中尋找最接近的值(Swift 實戰解析)

文章目錄 摘要描述題解答案題解代碼分析示例測試及結果時間復雜度空間復雜度總結 摘要 在日常開發中,我們經常需要在一組有序的數據中快速找到最接近某個目標值的元素。LeetCode 第 270 題“Closest Binary Search Tree Value”正是這樣一個問題。本文將深入解析該…

Kotlin高階函數多態場景條件判斷與子邏輯

Kotlin高階函數多態場景條件判斷與子邏輯 fun main() {var somefun: (Int, Float) -> Longval a 4val b 5fsomefun multi()//if 某條件println(somefun.invoke(a, b))//if 某條件somefun add()println(somefun.invoke(a, b)) }fun multi(): (Int, Float) -> Long {re…

嵌入式學習--江協51單片機day4

昨天周五沒有學習,因為中午沒有睡覺,下午和晚上擠不出整塊的時間。周日有考試今天也沒有學很多啊,但以后周末會是學一天,另一天休息和寫周總結。 今天學了串口通信和LED點陣屏,硬件原理是真的很迷,一但想搞…

Spring Cloud 以Gateway實現限流(自定義返回內容)

前言 Spring Cloud Gateway自帶RequestRateLimiterGatewayFilterFactory限流方案,可基于Redis和RedisRateLimiter實現默認算法為令牌桶的請求限流。作為自帶的該限流方案,其可與Spring生態的其它各項組件無縫集成,并且自身實現也相對完善/好用…

容器填充函數fill和memset對比總結

文章目錄 1、fill() 按元素填充2、memset() 按字節填充3、對比 1、fill() 按元素填充 用于將容器或數組的指定范圍內的元素賦值為指定值&#xff08;按元素類型填充&#xff09;。屬于 C STL 算法&#xff08;<algorithm> 頭文件&#xff09;。 // 從起始地址到結束地址…