目錄
一、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請求都是獨立的,服務器不會記住之前發生過的請求。
- 也就是:每個請求都是獨立的,服務器處理完請求后就會結束會話,不會保留任何會話信息。
- 為了解決無狀態協議帶來的問題,引入了Cookies和Session等技術來維持用戶會話。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 參數) 設置最大存活時間。參數的單位:秒。
具體的實踐大家自己嘗試!