Java Web-Cookie與Session

會話跟蹤技術

會話跟蹤技術是一種在 Web 應用程序中跟蹤用戶會話狀態的機制,它允許服務器在多個請求之間識別和關聯屬于同一用戶的請求,以便在整個會話過程中保持用戶相關的信息。以下是幾種常見的會話跟蹤技術:

Cookie

  • 概念:Cookie 是服務器發送到用戶瀏覽器并保存在本地的一小段數據,以鍵值對形式存儲。瀏覽器后續向同一服務器發起請求時,會自動在請求頭中攜帶這些 Cookie 數據。
  • 原理:用戶訪問服務器時,服務器在響應頭中通過Set-Cookie字段向瀏覽器發送 Cookie。瀏覽器接收后將其存儲在本地。之后瀏覽器每次向該服務器發送請求時,會在請求頭的Cookie字段中帶上這些 Cookie 信息,服務器據此識別用戶狀態。
  • 應用場景:用于記錄用戶偏好、實現自動登錄、跟蹤用戶行為等。

Session

  • 概念:Session 是服務器端用于跟蹤用戶會話的機制。服務器為每個用戶創建一個唯一的 Session 對象,用于存儲該用戶在整個會話期間的相關數據
  • 原理:用戶首次訪問服務器時,服務器為其創建一個唯一的 Session ID并通過響應頭中的Set-Cookie將該 ID 發送給瀏覽器,瀏覽器將其存儲在本地的 Cookie 中。后續請求時,瀏覽器會在請求頭的Cookie字段中帶上這個 Session ID,服務器根據該 ID 查找對應的 Session 對象,獲取和更新用戶相關數據。
  • 應用場景:常用于用戶認證與授權、購物車功能、多頁面表單數據傳遞等場景。

URL 重寫

  • 概念:通過在 URL 中附加會話相關的信息,如 Session ID,來跟蹤用戶會話。當用戶訪問一個頁面時,服務器將包含 Session ID 的新 URL 返回給瀏覽器,瀏覽器在后續請求中使用這個帶有 Session ID 的 URL,服務器就可以根據 URL 中的 Session ID 來識別用戶會話。
  • 原理:服務器在生成頁面的鏈接時,將 Session ID 作為參數附加到 URL 后面。用戶點擊鏈接時,瀏覽器將包含 Session ID 的 URL 發送給服務器,服務器從 URL 中解析出 Session ID,從而確定用戶的會話。
  • 應用場景:當瀏覽器禁用了 Cookie 時,可以作為替代方案來實現會話跟蹤。不過,由于 URL 中攜帶了會話信息,可能會存在一定的安全風險,且在某些情況下可能會導致 URL 過長。

隱藏表單域

  • 概念:在 HTML 表單中添加一個隱藏的輸入字段,用于存儲會話相關的信息,如 Session ID。當表單提交時,這個隱藏字段的值也會被發送到服務器,服務器可以根據這個值來跟蹤用戶會話。
  • 原理:服務器在生成 HTML 頁面時,在表單中插入一個隱藏的輸入字段,并將 Session ID 等會話信息作為該字段的值。用戶提交表單時,瀏覽器將表單數據包括隱藏字段的值一起發送給服務器,服務器從接收到的表單數據中獲取隱藏字段的值,從而識別用戶會話。
  • 應用場景:同樣可以在 Cookie 被禁用的情況下作為一種補充的會話跟蹤方式,但它只能在表單提交時傳遞會話信息,對于其他類型的請求(如直接訪問頁面)則無法使用。

一、Cookie

?1.概念介紹

Cookie 是服務器發送到用戶瀏覽器并保存在本地的小段數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶上并發送到服務器上。這些數據可以幫助服務器識別用戶身份、記錄用戶偏好等。

2.基本使用方法

設置 Cookie
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/setCookie")
public class SetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 創建一個 Cookie 對象,鍵為 username,值為 JohnCookie cookie = new Cookie("username", "John");// 設置 Cookie 的有效期為 3600 秒(1 小時)cookie.setMaxAge(3600);// 將 Cookie 添加到響應中resp.addCookie(cookie);resp.getWriter().println("Cookie has been set.");}
}
獲取 Cookie
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取請求中的所有 CookieCookie[] cookies = req.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if ("username".equals(cookie.getName())) {resp.getWriter().println("Username from cookie: " + cookie.getValue());return;}}}resp.getWriter().println("No username cookie found.");}
}

發送請求后控制臺輸出?

3.原理

當客戶端(瀏覽器)向服務器發送請求時,服務器可以在響應頭中添加?Set - Cookie?字段,瀏覽器接收到響應后會將這些 Cookie 存儲在本地。之后,瀏覽器每次向該服務器發送請求時,都會在請求頭中包含?Cookie?字段,將之前存儲的 Cookie 信息發送給服務器,服務器根據這些信息進行相應處理。

4.使用細節

  • 有效期:可以通過?setMaxAge()?方法設置 Cookie 的有效期。正數表示多少秒后過期,負數表示瀏覽器關閉時過期,0 表示立即刪除。
  • 作用域:可以通過?setPath?和?setDomain?方法設置 Cookie 的作用路徑和作用域名,只有在指定路徑和域名下的請求才會攜帶該 Cookie。
  • 安全性:可以通過?setSecure?方法設置 Cookie 只能通過 HTTPS 協議傳輸,通過?setHttpOnly?方法設置 Cookie 不能被 JavaScript 腳本訪問,防止 XSS 攻擊。
  • 存儲中文:URL編碼

5.應用場景

  • 記錄用戶偏好:如網站的主題顏色、字體大小等設置。
  • 實現自動登錄:存儲用戶的登錄憑證,下次訪問時自動登錄。
  • 跟蹤用戶行為:記錄用戶瀏覽過的頁面等信息,用于分析用戶行為。

二、Session?

1.概念介紹

Session 是服務器端的會話機制服務器會為每個客戶端(瀏覽器)創建一個唯一的 Session 對象,用于存儲該客戶端在整個會話期間的相關數據。客戶端通過一個唯一的 Session ID與服務器的 Session 對象進行關聯

2.基本使用方法

創建并使用 Session
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/createSession")
public class CreateSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取當前請求的 Session,如果不存在則創建一個新的HttpSession session = req.getSession(true);// 向 Session 中存儲一個屬性session.setAttribute("userRole", "admin");resp.getWriter().println("Session has been created and attribute set.");}
}
獲取 Session 中的數據
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/getSession")
public class GetSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取當前請求的 Session,如果不存在則返回 nullHttpSession session = req.getSession(false);if (session != null) {// 從 Session 中獲取屬性String userRole = (String) session.getAttribute("userRole");if (userRole != null) {resp.getWriter().println("User role from session: " + userRole);} else {resp.getWriter().println("No user role attribute found in session.");}} else {resp.getWriter().println("No session found.");}}
}

3.原理

當客戶端第一次訪問服務器時,服務器會創建一個新的 Session 對象,并為其生成一個唯一的 Session ID。服務器會將這個 Session ID 通過?Set - Cookie?響應頭發送給客戶端,客戶端將其存儲在本地的 Cookie 中。之后客戶端每次請求時,都會將這個 Session ID 包含在請求頭的?Cookie?字段中發送給服務器,服務器根據這個 Session ID 找到對應的 Session 對象,從而獲取和更新會話數據

4.使用細節

  • 活化、鈍化:在服務器正常關閉后,Tomcat會自動將Session數據寫入硬盤的文件中(鈍化),再次啟動服務器后,從文件中加載數據到Session中(活化)。二者保證了服務器重啟前后,數據的持久化。應用場景:購物車信息持久留存。
  • 存儲位置:Session 數據默認存儲在服務器的內存中,但也可以配置存儲在數據庫或文件系統中,以支持分布式環境。
  • 過期時間:可以通過?setMaxInactiveInterval?方法設置 Session 的最大不活動時間,超過這個時間 Session 會自動失效。或者設置如下圖依賴。
  • 銷毀:可以通過?invalidate?方法手動銷毀 Session。該方法可應用于用戶退出登錄

5.應用場景

  • 用戶認證與授權:存儲用戶的登錄狀態和權限信息,在用戶訪問受保護資源時進行驗證。
  • 購物車功能:將用戶添加到購物車的商品信息存儲在 Session 中,方便用戶在購物過程中操作。
  • 多頁面表單數據傳遞:在用戶填寫多個頁面的表單時,將中間數據存儲在 Session 中,最后一起處理。

三、Cookie 和 Session 的區別

存儲位置
  • Cookie數據存儲在客戶端(瀏覽器)
  • Session數據存儲在服務器端。
安全性
  • Cookie:由于存儲在客戶端,容易被篡改或竊取,安全性較低。但可以通過設置安全屬性(如?secure?和?HttpOnly)提高安全性。
  • Session:數據存儲在服務器端,相對安全。但如果 Session ID 泄露,可能會被攻擊者利用。
存儲容量
  • Cookie:單個 Cookie 通常限制在 4KB 左右,每個域名下的 Cookie 數量也有限制。
  • Session:存儲容量主要取決于服務器的配置,理論上可以存儲更多的數據。
生命周期
  • Cookie:可以通過設置?setMaxAge?方法控制有效期,分為會話期 Cookie(瀏覽器關閉時失效)和持久化 Cookie(指定過期時間)。
  • Session:可以通過?setMaxInactiveInterval?方法設置最大不活動時間,超過時間自動失效,也可以手動銷毀。
應用場景側重點
  • Cookie:更適合存儲一些不太敏感的用戶偏好信息,方便在不同頁面之間共享。
  • Session:主要用于存儲用戶的會話狀態和敏感信息,如登錄狀態、權限等。

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

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

相關文章

Spring Boot - 數據庫集成04 - 集成Redis

Spring boot集成Redis 文章目錄 Spring boot集成Redis一:redis基本集成1:RedisTemplate Jedis1.1:RedisTemplate1.2:實現案例1.2.1:依賴引入和屬性配置1.2.2:redisConfig配置1.2.3:基礎使用 2&…

STM32使用VScode開發

文章目錄 Makefile形式創建項目新建stm項目下載stm32cubemx新建項目IED makefile保存到本地arm gcc是編譯的工具鏈G++配置編譯Cmake +vscode +MSYS2方式bilibiliMSYS2 統一環境配置mingw32-make -> makewindows環境變量Cmake CmakeListnijia 編譯輸出elfCMAKE_GENERATOR查詢…

Oracle 12c 中的 CDB和PDB的啟動和關閉

一、簡介 Oracle 12c引入了多租戶架構,允許一個容器數據庫(Container Database, CDB)托管多個獨立的可插拔數據庫(Pluggable Database, PDB)。本文檔旨在詳細描述如何啟動和關閉CDB及PDB。 二、容器數據庫 (CDB) 2.1…

網絡仿真工具Core環境搭建

目錄 安裝依賴包 源碼下載 Core安裝 FAQ 下載源碼TLS出錯誤 問題 解決方案 找不到dbus-launch 問題 解決方案 安裝依賴包 調用以下命令安裝依賴包 apt-get install -y ca-certificates git sudo wget tzdata libpcap-dev libpcre3-dev \ libprotobuf-dev libxml2-de…

FPGA實現任意角度視頻旋轉(二)視頻90度/270度無裁剪旋轉

本文主要介紹如何基于FPGA實現視頻的90度/270度無裁剪旋轉,旋轉效果示意圖如下: 為了實時對比旋轉效果,采用分屏顯示進行處理,左邊代表旋轉前的視頻在屏幕中的位置,右邊代表旋轉后的視頻在屏幕中的位置。 分屏顯示的…

JavaEE:多線程進階

JavaEE:多線程進階 一、對比不同鎖策略之間的應用場景及其區別1. 悲觀鎖 和 樂觀鎖1.1 定義和原理1.2 應用場景1.3 示例代碼 2. 重量級鎖 和 輕量級鎖2.1 定義和原理2.2 應用場景2.3 示例代碼 3. 掛起等待鎖 和 自旋鎖3.1 定義和原理3.2 應用場景3.3 示例代碼 4. 幾…

董事會辦公管理系統的需求設計和實現

該作者的原創文章目錄: 生產制造執行MES系統的需求設計和實現 企業后勤管理系統的需求設計和實現 行政辦公管理系統的需求設計和實現 人力資源管理HR系統的需求設計和實現 企業財務管理系統的需求設計和實現 董事會辦公管理系統的需求設計和實現 公司組織架構…

pytest自動化測試 - pytest夾具的基本概念

<< 返回目錄 1 pytest自動化測試 - pytest夾具的基本概念 夾具可以為測試用例提供資源(測試數據)、執行預置條件、執行后置條件&#xff0c;夾具可以是函數、類或模塊&#xff0c;使用pytest.fixture裝飾器進行標記。 1.1 夾具的作用范圍 夾具的作用范圍&#xff1a; …

esp32-C3 實現DHT11(溫濕度)

安裝DHT傳感器庫&#xff1a; 在Arduino IDE中&#xff0c;進入項目 > 加載庫 > 管理庫。搜索DHT sensor library并安裝。 編寫代碼 定義引腳和傳感器類型初始化傳感器判斷傳感器是否正常讀取數據 源碼 #include <DHT.h> #include <DHT_U.h>// 定義DHT傳感器…

java構建工具之Gradle

自定義任務 任務定義方式&#xff0c;總體分為兩大類:一種是通過 Project 中的task()方法,另一種是通過tasks 對象的 create 或者register 方法。 //任務名稱,閉包都作為參數println "taskA..." task(A,{ }) //閉包作為最后一個參數可以直接從括號中拿出來println …

【Pytest】生成html報告中,中文亂碼問題解決方案

import pytestif __name__ "__main__":# 只運行 tests 目錄下的測試用例&#xff0c;并生成 HTML 報告pytest.main([-v, -s, --htmlreport.html, tests])可以以上方式生成&#xff0c;也可以在pytest.ini中設置 [pytest] addopts --htmlreport.html --self-contai…

MyBatis最佳實踐:提升數據庫交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一個優秀的基于 Java 的持久框架&#xff0c;內部對 JDBC 做了封裝&#xff0c;使開發者只需要關注 SQL 語句&#xff0c;而不關注 JDBC 的代碼&#xff0c;使開發變得更加的簡單MyBatis 通…

《Java程序設計》課程考核試卷

一、單項選擇題&#xff08;本大題共10個小題&#xff0c;每小題2分&#xff0c;共20分&#xff09; 1.下列用來編譯Java源文件為字節碼文件的工具是&#xff08; &#xff09;。 A.java B.javadoc C.jar D.javac 2…

【25考研】人大計算機考研復試該怎么準備?有哪些注意事項?

人大畢竟是老牌985&#xff0c;復試難度不會太低&#xff01;建議同學認真復習&#xff01;沒有機試還是輕松一些的&#xff01; 一、復試內容 由公告可見&#xff0c;復試包含筆試及面試&#xff0c;沒有機試&#xff01; 二、參考書目 官方無給出參考書目&#xff0c;可參照…

vue3中Teleport的用法以及使用場景

1. 基本概念 Teleport 是 Vue3 提供的一個內置組件&#xff0c;它可以將組件的內容傳送到 DOM 樹的任何位置&#xff0c;而不受組件層級的限制。這在處理模態框、通知、彈出菜單等需要突破組件層級限制的場景中特別有用。 1.1 基本語法 <template><teleport to&quo…

使用openwrt搭建ipsec隧道

背景&#xff1a;最近同事遇到了個ipsec問題&#xff0c;做的ipsec特性&#xff0c;ftp下載ipv6性能只有100kb, 正面定位該問題也蠻久了&#xff0c;項目沒有用openwrt, 不過用了開源組件strongswan, 加密算法這些也是內核自帶的&#xff0c;想著開源的不太可能有問題&#xff…

基于AnolisOS 8.6安裝GmSSL 3.1.1及easy_gmssl庫測試國密算法

測試環境 Virtual Box&#xff0c;AnolisOS-8.6-x86_64-minimal.iso&#xff0c;4 vCPU, 8G RAM, 60 vDisk。最小化安裝。需聯網。 系統環境 關閉防火墻 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux關閉 cat /etc/selinux/co…

HTML從入門到精通:鏈接與圖像標簽全解析

系列文章目錄 01-從零開始學 HTML&#xff1a;構建網頁的基本框架與技巧 02-HTML常見文本標簽解析&#xff1a;從基礎到進階的全面指南 03-HTML從入門到精通&#xff1a;鏈接與圖像標簽全解析 文章目錄 系列文章目錄前言一、鏈接與圖像標簽&#xff08;HTML 標簽基礎&#xff…

[STM32 - 野火] - - - 固件庫學習筆記 - - -十一.電源管理系統

一、電源管理系統簡介 電源管理系統是STM32硬件設計和系統運行的基礎&#xff0c;它不僅為芯片本身提供穩定的電源&#xff0c;還通過多種電源管理功能優化功耗、延長電池壽命&#xff0c;并確保系統的可靠性和穩定性。 二、電源監控器 作用&#xff1a;保證STM32芯片工作在…

數字圖像處理:實驗六

uu們&#xff01;大家好&#xff0c;2025年的新年就要到來&#xff0c;咸魚哥在這里祝大家在2025年每天開心快樂&#xff0c;天天掙大錢&#xff0c;自由自在&#xff0c;健健康康&#xff0c;萬事如意&#xff01;&#xff08;要是咸魚哥嘴笨的話&#xff0c;還望大家多多包涵…