Cookie(搭配domain)/Session(搭配HttpServletRequest+HttpSession)

各位看官,大家早安午安晚安呀~~~

如果您覺得這篇文章對您有幫助的話

歡迎您一鍵三連,小編盡全力做到更好
歡迎您分享給更多人哦

今天我們來學習:Cookie/Session

1.Cookie/Session的簡述

我們在講解HTTP協議的時候已經講解過Cookie了

HTTP 協議自身是屬于 "無狀態" 協議.

"無狀態" 的含義指的是:

默認情況下 HTTP 協議的客戶端和服務器之間的這次通信, 和下次通信之間沒有直接的聯系(不冪等).

但是實際開發中, 我們很多時候是需要知道請求之間的關聯關系的.

例如登陸網站成功后, 第?次訪問的時候服務器就能知道該請求是否是已經登陸過了(不然我每次登錄軟件,都要輸入賬戶密碼真的是太費勁了)

1.1回顧 Cookie

Cookie:瀏覽器在本地存儲數據的一種方式。

現代瀏覽器設計時,會避免網頁直接訪問計算機的文件系統,因此,瀏覽器封裝了操作文件的API,瀏覽器作為中間層,管理所有Cookie的讀寫操作。網頁不能直接訪問文件系統。

上述的令牌(SessionID)就通常存放在Cookie中

我們每一次訪問服務器的時候就要帶上Cookie(不管服務器要不要都會帶上)

此時在服務器這邊就需要記錄"令牌"(SessionID)信息, 以及令牌對應的用戶信息, 這個就是 Session 機制所做的工作(就像一個Hash表(里面都是鍵值對)

1.2.理解Session

Session:Session 是服務器端保存用戶信息的?種機制.

也可以這么說:Session是服務器為了保存用戶信息而創建的?個特殊的對象(本質上就是一個哈希表)

我們先來了解一下什么是會話。會話:?對話的意思

服務器同?時刻收到的請求是很多的. 服務器需要清楚的區分每個請求是從屬于哪個用戶,?也就是屬于哪個會話,?就需要在服務器這邊記錄每個會話以及與用戶的信息的對應關系.
注意:
Session默認是保存在內存中的,如果重啟服務器則 Session 數據就會丟失.

1.3.Cookie和Session的區別

  1. Cookie 是客戶端保存用戶信息的?種機制.
  2. Session 是服務器端保存用戶信息的?種機制.
  3. Cookie 和 Session之間主要是通過 SessionId 關聯起來的, SessionId 是 Cookie 和 Session 之間的橋梁。
  4. Cookie 和 Session 經常會在一起配合使用. 但是不是必須配合。Session 中的sessionId 也不需要非得通過 Cookie/Set-Cookie 傳遞, 比如通過URL傳遞.

1.4.domain

在 HTTP Cookie 中,domain?是一個非常重要的屬性,它決定了?Cookie 的作用域,即哪些域名可以訪問這個 Cookie通過設置?domain,你可以控制 Cookie 在哪些域名下生效。

譬如你給這個Cookie的domian是:127.0.0.1那么這個Cookie就只能在127.0.0.1(自己主機)下生效

直接理解:這個domain就是一個域名(給一個Cookie設置上這個域名(domain),這個Cookie就只能在這個域名下生效))

1.5.Cookie各個字段的解析

  1. ID=20

    • 含義:這是 Cookie 的核心數據,由鍵值對組成(ID?是名稱,20?是值)。
    • 作用:通常用于標識用戶會話(如登錄狀態、用戶 ID)或存儲自定義數據,具體含義由網站后臺邏輯決定。
  2. Path=/

    • 含義:指定 Cookie 的有效路徑。/?表示根路徑,即該 Cookie 對網站所有路徑(如?/page1/api/data)均有效。
    • 示例:若設置為?Path=/admin,則 Cookie 僅在訪問?https://example.com/admin?及子路徑時生效。
  3. Expires=Sat, 04 Jul 2026 07:05:02 GMT

    • 含義:Cookie 的過期時間(GMT 格式)。若未設置該字段,Cookie 會在瀏覽器關閉時過期(會話級 Cookie)。
    • 作用:控制 Cookie 的存儲時長,超過時間后瀏覽器會自動刪除。
  4. 其他常見字段(可能未顯示但重要)

    • Domain:你設置的?127.0.0.1?即為此字段,下文詳細說明。
    • Secure:若存在,說明 Cookie 僅在 HTTPS 連接下有效。
    • HttpOnly:防止 JavaScript 讀取 Cookie,提升安全性

domain具體解析:

?Domain 定義
  • 本質指定 Cookie 允許發送的目標域名或 IP 地址。
  • 示例
    • 若設置為?Domain=example.com,Cookie 會在訪問?example.com?及其子域名(如?sub.example.com)時發送。
    • 你設置的?127.0.0.1?是本地回環地址,代表僅對當前主機(本地開發環境)有效。
2.?Domain 匹配規則(本質就是域名和路徑匹配的? (或則子域名)時,才能訪問到這個cookie)
  • 嚴格匹配:Cookie 僅在請求域名與?Domain?完全一致或為其子域名時發送。
    • 例如:Domain=127.0.0.1?不會在請求?localhost?時發送(盡管兩者可能指向同一主機,但域名不同)。
  • 安全限制
    • 不能跨域名設置 Cookie(如?example.com?無法為?google.com?設置 Cookie)。
    • 子域名可訪問父域名的 Cookie(如?sub.example.com?可讀取?Domain=example.com?的 Cookie),但反之不行。
3.?本地開發場景的 Domain 應用
  • 場景:在 Postman 中測試本地服務(如?http://127.0.0.1:8080)時,設置?Domain=127.0.0.1?可確保 Cookie 僅在請求該地址時生效,避免干擾其他服務。
  • 對比:若設置為?Domain=localhost,則 Cookie 會在請求?localhost?時生效,需根據服務實際綁定的域名 / IP 選擇。

總之:

Cookie 工作原理總結
  1. 發送機制:當瀏覽器訪問符合?Domain?和?Path?條件的地址(或則子域名)時,自動攜帶對應 Cookie 到請求頭中。
  2. 用途:用于狀態保持(如登錄)、用戶偏好存儲、跟蹤用戶行為等。
  3. 安全提示
    • 生產環境中避免將敏感數據(如密碼)存入 Cookie。
    • 合理設置?HttpOnly?和?Secure?字段,防止 XSS 攻擊和中間人竊密。

2.如何獲得Cookie和Session

2.1獲得Cookie的兩種方法

先聲明:Spring MVC是基于 Servlet API 構建的原始 Web 框架, 也是在Servlet的基礎上實現的。

首先介紹兩個類:

  • HttpServletRequest :包含了HTTP請求中的所有信息(當然也包括Cookie(還有Cookie中的SessionID))
  • HttpServletResponse:包含了HTTP響應里面的所有信息
    比如向客戶端發送的數據, 響應頭, 狀態碼等. 通過這個對象提供的方法, 可以獲得服務器響應的所有內容

看似這兩個類十分的強大(其實就是很強大哈哈),但是我們使用這兩個類的時候還是會頻繁地出現一些相似的代碼(不是很方便)。于是Spring MVC在這兩個對象的基礎上進行了封裝, 給我們提供更加簡單的使用方法(只是封裝,但是本質上Spring MVC本質上還是從這兩個類里面拿到數據,只是我們省事了)

2.1.1.使用HttpServletRequest獲得Cookie的方法

 @RequestMapping("/getCookie")public String getCookie(HttpServletRequest request, HttpServletResponse response) { //這兩個參數不用傳//因為這兩個參數是Spring里面內置的對象,用的話需要聲明,不需要就不用聲明/* 本質上Spring也是直接從這兩個類里拿的參數,就譬如這個拿參數就太傳統了String name = request.getParameter("name");*///響應里面有什么response里面就有什么,我們想響應什么我們直接設置就好了//拿到CookieCookie[] cookies = request.getCookies();if (cookies != null) {Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName() + ";" + ck.getValue()));return "獲取Cookie成功";}return "cookie為空";}

結果:可以看到Cookies為空(默認情況下,第一次訪問時,瀏覽器默認不會攜帶任何 Cookie。?request.getCookies()?返回?null,不會打印任何內容?)

我們可以手動設置Cookie,其實這也是一種作弊的體現其實我們也能修改SessionID,但是服務器沒有這個SessionID也是白搭)

如何手動設置Cookie呢?

然后Header就會出現一個Cookie


然后就獲取Cookie成功了

2.1.2.利用注解@CookieValue

@RequestMapping("/getCookie2")  //直接通過注解的方式來獲取,注解里面的值就是要獲取的Cookie值public String getCookie2(@CookieValue("name") String name) {return "獲取的Cookie- name" + name;}

結果:

設置Cookie還是很困難的,有興趣的話大家可以自行學習哦~~

2.2.設置Session的三種方法

傳統的獲得Cookie的方法需要request.getCookies();(問就是)

這個我還要看,但不是現在

Spring還提供了一個內置類,直接獲得Session對象--HttpSession

2.2.1.使用HttpServletRequest獲得Session的方法

如何從Cookie中先拿到SessionID,根據SessionID獲取Session對象,如果一開始沒有Session,就會創建一個Session對象。獲取Session里面的屬性,前提是要有。但是Session是服務器用來存儲用戶信息的地方,我們沒辦法進行偽造,只能進行設置
    @RequestMapping("/getSession1")  //直接通過注解的方式來獲取,注解里面的值就是要獲取的Cookie值public String getSession1(HttpServletRequest request) {//從Cookie中先拿到SessionID,根據SessionID獲取Session對象,如果一開始沒有Session,就會創建一個Session對象HttpSession session = request.getSession();//獲取Session里面的屬性,前提是要有。但是Session是服務器用來存儲用戶信息的地方,我們沒辦法進行偽造,只能進行設置String name = (String) session.getAttribute("name"); // 獲取name屬性// 要進行強轉一下,我們獲取到的都是Object對象return "從session獲得值: "+name;}

結果:

然后我們直接設置一下Session,代碼實現:

 @RequestMapping("/setSession1")  //直接通過注解的方式來獲取,注解里面的值就是要獲取的Cookie值public String setSession1(HttpServletRequest request) {HttpSession session = request.getSession(); // 一樣的先拿Session對象session.setAttribute("name","zhangsan");  // 我們這里設置什么都可以畢竟是設置成Object類,當然獲取到的也是Object類return "設置session成功";}

然后再獲得一下Session:

2.2.2.HttpSession獲得Session的方法

@RequestMapping("/setSession2")public String setSession1(HttpSession session) {  // 直接利用session對象session.setAttribute("name","zhangsan");return "設置session成功";}

2.2.3.@SessionAttribute注解的方法獲得Session

  @RequestMapping("/getSession3")public String getSession3(@SessionAttribute("name") String name) {return "username:"+name;}

2.3.設置Session的兩種方法

2.3.1.HttpselvertResponse設置Session

上面第一種獲得Session方法我們已經演示過(設置完SessionID會發生變化

 @RequestMapping("/setSession1")  //直接通過注解的方式來獲取,注解里面的值就是要獲取的Cookie值public String setSession1(HttpServletRequest request) {HttpSession session = request.getSession(); // 一樣的先拿Session對象session.setAttribute("name","zhangsan");  // 我們這里設置什么都可以畢竟是設置成Object類,當然獲取到的也是Object類return "設置session成功";}

2.3.2.利用HttpSession設置Session

 @RequestMapping("/setSession2")public String setSession1(HttpSession session) {  // 直接利用session對象session.setAttribute("name","zhangsan");return "設置session成功";}

3.如何獲得和設置請求頭

3.1傳統獲取 header

獲取Header也是從 HttpServletRequest 中獲取
 @RequestMapping("/getHeader1")public String getHeader1(HttpServletRequest request){ //直接使用內置對象來String userAgent = request.getHeader("User-Agent");return   "User-Agent:"+userAgent;}

3.2.注解@RequestHeader

  @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent) {return "userAgent:"+userAgent;}

4.響應

直接打印?Cookie?對象的問題,遍歷數組并打印每個?Cookie?對象時:

for (Cookie ck : cookies) {System.out.println(ck); // 輸出:jakarta.servlet.http.Cookie@e2b7326c
}

不管是 cookies.toString()還是Arrays.toString(cookies),還是sout(Cookies)都需要Cookie中實現了自己的toString方法,不然就是打印的

類名+哈希值(jakarta.servlet.http.Cookie@e2b7326c)

  • 原因Cookie?類沒有重寫?toString()?方法,默認調用?Object.toString(),返回?類名@哈希值

  • 解決方案:手動輸出?Cookie?的屬性(如?getName()?和?getValue())。

最后:
在我們前面的代碼例子中,都已經設置了響應數據, Http響應結果可以是數據, 也可以是靜態頁面。也可以針對響應設置狀態碼, Header信息等

上述就是Cookie(搭配domain)/Session(搭配HttpServletRequest+HttpSession)的全部內容啦,不知道您對文章中的問題和思想是否都學會理解了呢?

能看到這里相信您一定對小編的文章有了一定的認可。

有什么問題歡迎各位大佬指出
歡迎各位大佬評論區留言修正~~

您的支持就是我最大的動力???!!!

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

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

相關文章

240.搜索二維矩陣Ⅱ

純暴力有點太唐了&#xff0c;不過竟然能過&#xff1b;還有行和列的表示我一直搞反了。。。class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int i 0 ;i<matrix.length;i){for(int j 0 ;j<matrix[0].length;j){if(matrix[i][j]target)…

【計算機組成原理】-CPU章節學習篇—筆記隨筆

計算機組成原理 CPU 章節知識點總結&#xff08;適用于 408 考研&#xff09;? 一、CPU 的功能與基本結構? 1.1 CPU 的功能? CPU&#xff08;中央處理器&#xff09;是計算機的核心部件&#xff0c;主要功能包括&#xff1a;? 指令控制&#xff1a;程序的順序執行&#xff…

公用測控裝置的功能

公用測控裝置在電力系統中廣泛應用于變電站的高壓開關單元、變壓器本體及低壓側等對象。它集測量、控制、保護于一體&#xff0c;確保電網的安全、穩定運行。公用測控裝置采用高性能硬件架構&#xff0c;如32位微控制器和獨立AD采樣技術&#xff0c;結合軟件算法&#xff0c;實…

數據庫|達夢DM數據庫配置實例步驟

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近因為一個信創項目&#xff0c;要使用達夢DM數據庫&#xff0c; 因此安裝了達夢DM數據庫來學習使用&#xff0c; 上一節中記錄了安裝Windows版本達夢DM數據庫的過程步驟&#xff0c; 這一節緊接著上一節《數據庫…

三十一、【高級特性篇】接口用例參數化與關聯:實現上下文數據傳遞

三十一、【高級特性篇】接口用例參數化與關聯:實現上下文數據傳遞 前言準備工作第一部分:后端數據模型調整1. 升級 `TestCase` 模型2. 生成并應用數據庫遷移3. 更新 `TestCaseSerializer`第二部分:后端測試執行器強化1. 修改 `execute_api_test_case` 函數2. 修改 Celery 任…

PCA通過“找最大方差方向”實現降維,本質是用更少的變量捕捉原始數據的主要模式

什么事 PCA(主成分分析) PCA(主成分分析)的原理與通俗舉例 PCA 是什么? PCA(Principal Component Analysis)是一種常用的降維算法,核心目標是將高維數據映射到低維空間,同時盡可能保留原始數據的關鍵信息(方差最大的方向)。 核心原理:找“最能代表數據的方向”…

JAVA synchronized關鍵字涉及的Monitor對象中 EntryList和WaitSet工作機制

在Java的synchronized同步機制中&#xff0c;Monitor對象的EntryList和WaitSet是兩個關鍵隊列&#xff0c;它們分別管理不同狀態的線程。下面我將詳細解釋它們的工作原理&#xff0c;并提供代碼示例說明。 EntryList&#xff08;鎖競爭隊列&#xff09; 作用機制 EntryList保…

js-day10

JS學習之旅-day101. 作用域1.1 局部作用域1.2 全局作用域1.3 作用域鏈1.4 JS垃圾回收機制&#xff08;GC&#xff09;1.5 閉包1.6 變量提升2. 函數進階2.1 函數提升2.2 函數參數2.3 箭頭函數3. 解構賦值3.1 數組解構3.2 對象解構4. 數組遍歷4.1 forEach4.2 filter1. 作用域 作…

智能數字式毫秒計在實際生活場景中的應用

在電力領域&#xff0c;SYN5307型數字毫秒表可精準監測特高壓變電站斷路器合閘時間差&#xff0c;定位繼電保護裝置信號延遲&#xff1b;工業自動化中&#xff0c;優化汽車焊裝線時序、提升半導體晶圓切割良率&#xff1b;科研計量上&#xff0c;助力量子通信同步校準&#xff…

Java面試基礎:概念

1. Java的特點跨平臺性&#xff1a;Java的 “編寫一次&#xff0c;運行無處不在” 是其最大的特點之一。Java編譯器將源代碼編譯成字節碼(bytecode)&#xff0c;該字節碼可以在任何安裝了Java虛擬機(JVM)的系統上運行。面向對象&#xff1a;Java是一門嚴格的面向對象編程語言&a…

PyQt5高級窗口控件詳解:停靠窗口、多文檔界面與滾動條

掌握PyQt5的高級窗口控件&#xff0c;讓你的GUI應用具備專業級的布局與交互體驗 在PyQt5應用開發中&#xff0c;高效管理窗口布局和實現復雜交互功能是提升用戶體驗的關鍵。本文將深入解析三個核心高級控件&#xff1a;停靠窗口&#xff08;QDockWidget&#xff09;、多文檔界面…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | DrawingApp(畫板組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— DrawingApp組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script setup>…

Eureka、Nacos、LoadBalance、OpenFeign?之間的區別聯系和協作 (附代碼講解)

這篇文章聊聊微服務里的這幾個老伙計&#xff1a;Eureka、Nacos、LoadBalance、OpenFeign。咱們做微服務開發&#xff0c;總會跟這幾個組件打交道&#xff1a;Eureka、Nacos、Spring Cloud LoadBalancer、OpenFeign。它們各司其職又互相配合&#xff0c;今天就把它們的關系、用…

JavaSE-繼承

繼承&#xff08;inheritance&#xff09;繼承的意義我們首先來看下面兩個類&#xff1a;public class Dog {public String name;public int age;public void eat(){System.out.println(this.name"正在吃飯");}public void bark(){System.out.println(this.name"…

第二屆虛擬現實、圖像和信號處理國際學術會議(VRISP 2025)

重要信息 官網&#xff1a;www.icvisp.net 時間&#xff1a;2025年8月1-3日 地點&#xff1a;中國-長沙 簡介 近年來&#xff0c;虛擬現實技術取得了顯著進步&#xff0c;與5G、云計算和物聯網等新一代信息技術的融合加速&#xff0c;推動了其在硬件、軟件和內容應用等方面…

SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分離版:整體布局、架構調整(二)

目錄 一、前言 二、后端調整 1.實體類調整 2.菜單相關接口 3.用戶相關接口 4.新增工具類 5.新增菜單樹返回類 6.配置類、攔截器 三、前端調整 1.請求調整 2.頁面布局、樣式調整 1.user.vue 2.index.vue 3.請求攔截 四、開發過程中的問題 五、附&#xff1a…

vue3官方文檔學習心得

這幾天抽空把vue3的文檔整個看了一遍。簡介 | Vue.js 23年寫過一個vue2的項目&#xff0c;24年寫了一個vue3的項目&#xff0c;頁面功能比較簡單&#xff0c;用幾個簡單的API&#xff0c;watch、watchEffect、ref、reactive就能實現的業務功能。 寫了幾年的react的&#xff0…

Pycharm恢復默認設置,配置導致復制粘貼等不能使用

在file 種找到manage IDE settings在manage IDE settings中找到restore default settings

【王樹森推薦系統】召回12:曝光過濾 Bloom Filter

概述 曝光過濾通常是在召回階段做&#xff0c;具體的方法就是用 Bloom Filter 曝光過濾問題 如果用戶看過某個物品&#xff0c;則不再把該物品曝光給用戶。原因是同一個物品重復曝光給用戶會損害用戶體驗&#xff0c;但也不是所有推薦系統都有曝光過濾&#xff0c;像 youtube 這…

基于STM32單片機的心率血氧監測系統設計(STM32代碼編寫+手機APP設計+PCB設計+Proteus仿真)

系列文章目錄 文章目錄 系列文章目錄前言1 資料獲取與演示視頻1.1 資料介紹1.2 資料獲取1.3 演示視頻 2 系統框架3 硬件3.1 主控制器3.2 顯示屏3.3 WIFI模塊3.4心率血氧傳感器 4 設計PCB4.1 安裝下載立創EDA專業版4.2 畫原理圖4.4 使用嘉立創下單助手進行下單&#xff0c;打板。…