JavaWeb學習(2)(Cookie原理(超詳細)、HTTP無狀態)

目錄

一、HTTP無狀態。

(1)"記住我"?

(2)HTTP無狀態。

(3)信息存儲客戶端中。如何處理?

1、loaclStorage與sessionStorage。

2、Cookie。

二、Cookie。

(1)Cookie是什么?

(2)Cookie的特征。

1、Cookie組成。

2、Cookie的主要特性。

(3)Cookie的API。

1、創建Cookie。

2、發送Cookie。

3、獲取Cookie值。

(4)Cookie的覆蓋。

1、案例演示。

2、Cookie路徑(path)。

3、Cookie覆蓋。

(5)Cookie的生命周期。

1、什么是Cookie的生命?

2、Cookie死亡。

3、Cookie最大存活時間。


一、HTTP無狀態。

(1)"記住我"?
  • 通常,處于登錄界面時,我們輸入用戶名與密碼點擊"提交"前,會有一個“記住我”功能!當用戶名、密碼驗證成功,瀏覽器該如何存儲對應的信息(用戶名、密碼等等)呢?

  • 是保存在服務器?還是保存在客戶端中?

(2)HTTP無狀態。
  • HTTP協議是無狀態的,這意味著服務器不會保存任何關于客戶端請求之間的信息
  • 每次HTTP請求都是獨立的,服務器不會記住之前發生過的請求。
  • 也就是:每個請求都是獨立的,服務器處理完請求后就會結束會話,不會保留任何會話信息
  • 為了解決無狀態協議帶來的問題,引入了CookiesSession等技術來維持用戶會話。Cookies是客戶端的存儲機制,用于保存狀態信息;而Session則是服務器端的存儲機制,用于跟蹤用戶狀態。

  • 如果將“用戶信息”存在在服務器中。那么就需要"東西"讓服務器分辨當前是哪個用戶訪問,再給對應的用戶信息。
  • 這樣服務器的壓力就會很大!所以應該是每個用戶的"登錄個人信息"存儲在用戶所安裝的客戶端瀏覽器中,而不是存儲在服務器
  • 這樣當用戶A登錄時,從用戶A的客戶端瀏覽器拿到對應的信息。當用戶B登錄時,就從用戶B客戶端瀏覽器拿到對應的信息。這樣就有效的區分了每個客戶端的信息。

(3)信息存儲客戶端中。如何處理?
  • 基于客戶端瀏覽器的訪問。如何將數據保存在客戶端瀏覽器中?
  • 登錄校驗的邏輯代碼是在服務器端運行的。只要登錄成功后,就會將(用戶名、密碼)存儲在到客戶端瀏覽器中。

  • 如下三個被紅色框選中的(客戶端瀏覽器中)都可以存儲信息。


1、loaclStorage與sessionStorage。
  • 其中本地存儲空間(loaclStorage)、會話存儲(sessionStorage)空間:都是純正的js技術。
  • 它們之間的區別:loaclStorage是所有用戶都可以拿到信息。(數據在瀏覽器關閉后仍可保留)而sessionStorage是在一次會話中有效。(與服務器一次通信)

2、Cookie。
  • 既可以使用js操作,也可以使用Java進行操作!因為服務器端代碼(/..xxServlet)也是Java語言寫的,這就剛好可以使用這個"Cookie"。
  • 接下來就詳細的介紹Cookie!

二、Cookie。

(1)Cookie是什么?
  • "Cookie"翻譯成中文:小甜點,小餅干的意思。
  • 在HTTP中它表示服務器發送給客戶端瀏覽器的小甜點

  • 其實Cookie就是一個鍵和一個值(key/value)構成的,隨著服務器端的響應發送給客戶端瀏覽器。
  • 注意:Cookie的存儲的key/value都是String類型域對象中存儲的value是object類型

  • 如下:Cookie是由服務器創建,然后通過響應發送給客戶端的一個鍵值對。
  • 客戶端會保存Cookie,并會標注出Cookie的來源(哪個服務器的Cookie)。
  • 當客戶端向服務器發出請求時會把所有這個服務器Cookie包含在請求中發送給服務器,這樣服務器就可以識別客戶端了!


(2)Cookie的特征。
1、Cookie組成。
  • Cookie通常包含一個(名稱)、一個,以及一些屬性。(如有效期、路徑、域和安全標志)


  • 可以看到鍵"user"——>值"lisi"、鍵"password"——>值"123456"。
  • 響應的服務器是本機:http://localhost:8080。
  • 路徑:"/"。表示所有的請求都可以拿到該Cookie。


2、Cookie的主要特性。
  • Cookie的工作原理涉及到客戶端(瀏覽器)和服務器之間的交互。
  • Cookie創建于服務器,保存于客戶端瀏覽器上不同瀏覽器之間Cookie無法共享,無法跨瀏覽器
  • 客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。
  • Cookie本身是一種有用的技術,用于在客戶端存儲狀態信息,但它也存在一些安全風險。在實際案例中,還需要對Cookie進行加密或者不存儲敏感信息。(否則明文顯示)

(3)Cookie的API。
  • Cookie是一個類(class)。

1、創建Cookie。
  • 通常都是使用:new 構造方法
  • 構造方法只有一個:new Cookie(鍵名,鍵值)。


  • 案例演示。創建服務器:AServlet。創建兩個Cookie(cookie1、cookie2)。并使用addCookie()方法發送到客戶端對應的Cookie如果不發送,客戶端無法得到Cookie
package com.fs.web;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;/*** @Title: AServlet* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/27 下午4:52* @description: 測試類*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//創建CookieCookie cookie1 = new Cookie("k1","v1000");Cookie cookie2 = new Cookie("k2","v2000");//發送Cookieresp.addCookie(cookie1);resp.addCookie(cookie2);}
}

  • 此時cookie1的k1與v1000、cookie2的k2與v2000都已經存儲在客戶端中。


2、發送Cookie。
  • 服務器中調用方法:addCookie(Cookie對象)
  • 驗證:之后的請求,客戶端瀏覽器會自動的攜帶Cookie通過請求頭發送給服務器。
  • 創建BServlet,里面只重寫了doGet()方法。直接再次請求訪問BServlet。
package com.fs.web;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;/*** @Title: BServlet* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/27 下午8:18* @description: 測試*/
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}
  • 顯然是自動的將Cookie發送給服務器了。



3、獲取Cookie值。
  • 方法1。通過request.getHeader("Cookie")。不推薦!


  • 方法2。request.getCookies()。這樣可以拿到所有的Cookie。再通過循環遍歷,拿取對應的鍵名的鍵值。先通過getName()拿到鍵名,再根據鍵名拿到值getValue()


package com.fs.web;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;/*** @Title: BServlet* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/27 下午8:18* @description: 測試*/
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//獲取指定CookieCookie[] cookies = req.getCookies();for (Cookie cookie : cookies) {String name = cookie.getName();if(name.equals("k1")){String value = cookie.getValue();System.out.println(name);System.out.println(value);break;}}/*String cookie = req.getHeader("Cookie");System.out.println(cookie);*/}
}

  • 成功拿到鍵名"k1"對應的鍵值"v1000"。


(4)Cookie的覆蓋。
1、案例演示。
  • 先訪問/AServlet。再訪問/user/AServlet。看看對應的Cookie。
  • /AServlet。

  • /user/AServlet。


2、Cookie路徑(path)。
  • 可以通過設置Cookie的path來指定瀏覽器,在訪問什么樣的路徑時,包含什么樣的Cookie
  • 如果Cookie的name(鍵名)與path(路徑)一樣,就會覆蓋value(鍵值)
  • 如果沒有設置path:默認值,創建Cookie的資源(服務器)的上級路徑
  • 像訪問資源(/user/BServlet)對應的path:"/user"。訪問資源(/BServlet)對應的path:"/"。

  • 舉例訪問某個路徑下的資源,能訪問的對應Cookie。




  • 創建Cookie時,主動設置Cookie路徑。方法:setPath()


3、Cookie覆蓋。
  • 修改"/user/AServlet"。重新訪問。


(5)Cookie的生命周期。
1、什么是Cookie的生命?
  • Cookie不只是有name(鍵名)和value(鍵值)。Cookie還有生命。

  • 所謂Cookie生命就是Cookie在客戶端的有效時間。可以通過setMaxAge(int)來設置Cookie的最大有效時間。


2、Cookie死亡。
  • 像上面的BServlet,我把所有的客戶端瀏覽器關閉(結束本次會話)。對應的Cookie(cookie1的k1與v1000、cookie2的k2與v2000)消失了。

  • 因為它們都是會話級別。會話結束,對應的Cookie自動失效。


  • k1、k2已消失。


3、Cookie最大存活時間。
  • 默認存活時間:會話級別。只有客戶端的瀏覽器關閉,這個Cookie就會被刪除!

  • 注意:如果是服務器關閉,只要客戶端不關閉,Cookie不會被刪除。


  • 調用setMaxAge(int 參數) 設置最大存活時間。參數的單位:秒。

  • 具體的實踐大家自己嘗試!

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

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

相關文章

SpringBoot教程(三十二) SpringBoot集成Skywalking鏈路跟蹤

SpringBoot教程(三十二) | SpringBoot集成Skywalking鏈路跟蹤 一、Skywalking是什么?二、Skywalking與JDK版本的對應關系三、Skywalking下載四、Skywalking 數據存儲五、Skywalking 的啟動六、部署探針 前提: Agents 8.9.0 放入 …

flask創建templates目錄存放html文件

首先,創建flask項目,在pycharm中File --> New Project,選擇Flask項目。 然后,在某一目錄下,新建名為templates的文件夾,這時會是一個普通的文件夾。 然后右擊templates文件夾,選擇Unmark as …

Java進階(注解,設計模式,對象克隆)

Java進階(注解,設計模式,對象克隆) 一. 注解 1.1 什么是注解 java中注解(Annotation),又稱java標注,是一種特殊的注釋 可以添加在包,類,成員變量,方法,參數等內容上 注解會隨同…

部署loki,grafana 以及springcloud用法舉例

文章目錄 場景docker 部署grafanadocker-compose部署loki維護配置文件 local-config.yaml維護docker-compose.yml配置啟動 grafana 添加loki數據源springcloud用法舉例查看loki的explore,查看日志 場景 小公司缺少運維崗位,需要研發自己部署日志系統,elk…

keil報錯---connection refused due to device mismatch

解決辦法如下: 記得改成1 把Enable取消

第三節、電機定速轉動【51單片機-TB6600驅動器-步進電機教程】

摘要:本節介紹用定時器定時的方式,精準控制脈沖時間,從而控制步進電機速度 一、計算過程 1.1 電機每一步的角速度等于走這一步所花費的時間,走一步角度等于步距角,走一步的時間等于一個脈沖的時間 w s t e p t … ……

vue中pdf.js的使用,包括pdf顯示,跳轉指定頁面,高亮關鍵詞

目錄 一、下載pdf.js 二、引入到本地的項目中 三、實現預覽pdf 四、跳轉到指定頁面 五、利用pdf里面的find查找關鍵詞 六、修改頁面大小為實際大小 一、下載pdf.js https://github.com/mozilla/pdf.js 里面有很多的版本, 高版本的可能瀏覽器不兼容或者還要考…

OD B卷【連續字母長度】

題目 給定一個字符串,只包含大寫字母,求在包含同一字母的子串中,長度第k長的子串的長度,相同字母只取最長的那個子串。 輸入描述: 第一行輸入一個子串(長【1,100】),只包含大寫字母…

python中的 Pydantic 框架介紹

Pydantic 框架介紹 Pydantic 是一個用于數據驗證和設置管理的 Python 庫。它主要通過數據模型類的定義來處理 JSON 數據、解析請求和響應數據,并提供自動化的驗證和轉換。Pydantic 主要用于處理 Python 類型的安全性和驗證,尤其在 FastAPI 等現代 Pytho…

橋接模式和組合模式的區別

橋接模式(Bridge Pattern)和組合模式(Composite Pattern)都是結構型設計模式,旨在解決對象結構的復雜性問題,但它們的應用場景和目的有所不同。以下是它們的區別: 1. 定義與目的 橋接模式&…

Qt 小項目 學生管理信息系統

主要是對數據庫的增刪查改的操作 登錄/注冊界面: 主頁面: 添加信息: 刪除信息: 刪除第一行(支持多行刪除) 需求分析: 用QT實現一個學生管理信息系統,數據庫為MySQL 要求&#xf…

14.數據容器-set集合

特點 無序的,元素不重復,自帶去重功能。 可以容納不同類型的元素數據。 # 定義一個空set my_set {} your_set set() my_set {aa, bb, bb, aa} # {aa, bb} print(my_set) 因為set集合是無序的,所以集合不支持下標索引訪問。所以set集合…

“量子躍遷與數據織網:深入探索K最近鄰算法在高維空間中的優化路徑、神經網絡融合技術及未來機器學習生態系統的構建“

🎼個人主頁:【Y小夜】 😎作者簡介:一位雙非學校的大二學生,編程愛好者, 專注于基礎和實戰分享,歡迎私信咨詢! 🎆入門專欄:🎇【MySQL&#xff0…

硬件選型規則

光源選型: 先用型號中帶H的,沒有的選標準的. 光源和光源控制器的搭配需要確保接口一致。 根據型號表中的最佳工作距離和相機的尺寸。 光源控制器選型: 首先選擇海康風格系列光源控制器考慮與光源的接口匹配。功率應該滿足接近光源功率。檢查是否退市…

【QNX+Android虛擬化方案】135 - QNX側如何Dump 88Q5152 MIBS報文計數

【QNX+Android虛擬化方案】135 - QNX側如何Dump 88Q5152 MIBS報文計數 一、讀取 88Q5152 MIBS 計數二、讀取 88Q5152 WDT 相關寄存器基于原生純凈代碼,自學總結 純技術分享,不會也不敢涉項目、不泄密、不傳播代碼文檔!!! 本文禁止轉載分享 !!! 匯總鏈接:《【QNX+Andro…

C#核心(15)繼承中的構造函數

前言 我們之前學過構造函數是什么東西,今天的內容也和構造函數緊密相關,一個繼承了父親的子類里面構造函數的規則是什么樣的,今天內容很簡單,請聽我慢慢講來。 基本概念 特點:當申明一個子類時,先執行父…

TVbox源貢獻指南

歡迎各路大佬踴躍提PR,分享爬蟲代碼。 源碼倉庫地址 https://github.com/lushunming/AndroidCatVodSpider 快速開始 本工程是一個完整的AndroidStudio工程,請你用AS打開編輯。 工程調試完畢后要需要導出生成jar文件配合軟件使用,執行根目…

FastAPI快速入門

文章目錄 了解FastAPI程序結構第一步,導入FastAPI第二步,創建一個app實例第三步,編寫一個 路徑操作裝飾器第五步、運行開發服務器uvicorn main:app --reload即可訪問api鏈接。符案例 聲明路徑參數聲明路徑參數的類型get請求查詢參數請求體如何…

云計算.運維.面試題

1、計算機能直接識別的語言( C )。 A、匯編語言 B、自然語言 C、機器語言 D、高級語言 2、應用軟件是指( D )。 A、所有能夠使用的軟件 B、能被各應用單位共同使用的某種軟件 C、所有計算機上都應使用的基本軟件D、專門為某一應用目的而編制的軟件 3、計算機的顯示器是一…

如何優雅地實現單例模式?內部靜態類還是雙重檢查鎖定?

在最近的一個項目中,我需要為一個核心配置類實現單例模式。在設計過程中,我發現要同時滿足延遲加載和線程安全這兩個要求,常見的實現方式有兩種:內部靜態類和雙重檢查鎖定(Double-Checked Locking, DCL)。 …