目錄
1.前言
2.正文
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. 工作原理
客戶端首次訪問服務器
服務器通過?
Set-Cookie
?響應頭下發 Cookie瀏覽器后續請求自動通過?
Cookie
?請求頭發送 Cookie
2.1.4session
1. 定義
Session 是服務器端存儲的用戶會話數據,通過唯一的?Session ID?標識用戶,該 ID 通常通過 Cookie 傳遞。
2. 工作原理
客戶端首次訪問服務器
服務器創建 Session 并生成 Session ID
通過?
Set-Cookie
?下發 Session ID瀏覽器后續請求攜帶 Session ID
服務器通過 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成功";
}
關鍵點詳解:
@RequestMapping("/r11")
這是一個 Spring MVC 注解
表示當訪問?
/r11
?路徑時,會執行這個方法等價于?
@GetMapping("/r11")
(如果只處理 GET 請求)
HttpServletRequest request
Spring 會自動注入當前 HTTP 請求對象
該對象包含請求的所有信息(頭信息、參數、Cookie 等)
request.getCookies()
重要方法:從請求中獲取所有 Cookie
返回?
Cookie[]
?數組(可能為 null)每個 Cookie 對象包含:
getName()
:獲取 Cookie 名稱
getValue()
:獲取 Cookie 值其他方法:
getDomain()
,?getPath()
,?isHttpOnly()
?等非空檢查
必須檢查?
cookies != null
如果瀏覽器沒有發送任何 Cookie,該方法返回 null
不檢查會導致?
NullPointerException
Cookie 遍歷
使用增強 for 循環遍歷數組
每個?
Cookie
?對象代表一個鍵值對
在瀏覽器中打開該網頁,接下來通過fiddler抓包工具對其抓包:?
另外我們可以在postman設置cookies的值,格式是鍵值對。
通過postman也可以進行連接:
返回某個鍵值對的值:?
//返回cookie中單個鍵的值@RequestMapping("/r12")public String r12(@CookieValue ("name") String name){return "cookie該key的值" + name;}
?關鍵點詳解:
?
@RequestMapping("/r12")
定義了一個處理 HTTP 請求的端點
默認支持所有 HTTP 方法(GET/POST等)
建議明確指定方法類型,如?
@GetMapping
@CookieValue("name")
Spring MVC 提供的注解
自動從請求的 Cookie 中提取名為 "name" 的值
注入到方法參數?
String name
?中返回值處理
直接拼接字符串返回
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設置成功";
}
關鍵點詳解
request.getSession()
核心方法,獲取當前會話的?
HttpSession
?對象重要特性:
如果 Session 不存在,會自動創建新 Session
等價于?
request.getSession(true)
如果不想自動創建,可使用?
request.getSession(false)
setAttribute()
?方法
存儲數據的標準方式
參數說明:
void setAttribute(String name, Object value)
可以存儲任何可序列化的 Java 對象
相同 name 會覆蓋舊值
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;} }
request.getSession(false)
:
參數?
false
?表示不自動創建新 Session如果 Session 不存在則返回?
null
安全校驗:
顯式檢查?
session == null
?處理未登錄情況避免直接操作可能為 null 的 Session
類型轉換:
getAttribute()
?返回?Object
?類型需要強制轉換為目標類型(這里是?
String
)
?方法二:直接注入 HttpSession
@RequestMapping("/r15") public String getSession2(HttpSession session) {// 直接使用注入的 Session 對象String name = (String) session.getAttribute("name");return "登錄用戶為: " + name; }
自動注入:
Spring 會自動注入當前請求的?
HttpSession
等價于?
request.getSession(true)
行為特點:
如果 Session 不存在會自動創建新 Session
可能導致不必要的 Session 創建
空值風險:
name
?屬性可能不存在(返回?null
)
?方法三:使用 @SessionAttribute 注解
@RequestMapping("/r16") public String getSession3(@SessionAttribute("name") String name) {return "登錄用戶為: " + name; }
注解特性:
直接從 Session 中提取指定屬性
自動完成類型轉換(無需顯式強轉)
異常處理:
如果屬性不存在會拋出?
HttpSessionRequiredException
可以使用?
required = false
?避免與?
@ModelAttribute
?的區別:
@SessionAttribute
?只從 Session 讀取
@ModelAttribute
?會先檢查 Session 再檢查請求參數
方法 | 特點 | 適用場景 | 是否自動創建 Session |
---|---|---|---|
r14 | 通過 HttpServletRequest 獲取 | 需要精確控制 Session 創建 | 可控制 (false) |
r15 | 直接注入 HttpSession | 簡單讀取場景 | 自動創建 (true) |
r16 | 使用 @SessionAttribute 注解 | 需要特定 Session 屬性 | 自動創建 (true) |
3.小結
今天的分享到這里就結束了,喜歡的小伙伴點點贊點點關注,你的支持就是對我最大的鼓勵,大家加油!