主頁 > 企業開發 > 記錄--強制快取這么暴力,為什么不使用協商快取

記錄--強制快取這么暴力,為什么不使用協商快取

2023-06-26 09:03:19 企業開發

這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

前段時間在看面經的時候,發現很多份面經中都被問到了 強快取協商快取,因此我覺得有必要寫一篇文章來好好聊聊這兩者,

強快取和協商快取

瀏覽器快取是瀏覽器在本地磁盤對用戶最近請求過的檔案進行存盤,當訪問者再次訪問同一頁面時,瀏覽器就可以直接從本地磁盤加載檔案,其中瀏覽器快取就分為 強快取協商快取:

  1. 強快取: 當瀏覽器在請求資源時,根據回應頭中的快取策略資訊,判斷是否使用本地快取副本而無需發送請求到服務器,如果資源被標記為強快取,瀏覽器會直接從本地快取中加載資源,而不發送請求到服務器,從而提高頁面加載速度并減輕服務器負載;
  2. 協商快取: 協商快取是一種快取策略,用于在資源未過期但可能已經發生變化時,通過與服務器進行協商確定是否使用本地快取,協商快取通過在請求中發送特定的條件資訊,讓服務器判斷資源是否有更新,并回傳相應的狀態碼和回應頭資訊,以指示瀏覽器是否可以使用本地快取;

所以根據以上所聊到的特點,瀏覽器快取有以下幾個方面的優點:

  1. 減少冗余的資料傳輸;
  2. 減少服務器負擔;
  3. 加快客戶端加載網頁的速度;

瀏覽器會首先獲取該資源快取的 header 資訊,然后根據 Cache-Controlexpires 來判斷是否過期,

如圖,在瀏覽器第一次發送請求后,需要再次發送請求時,它會經過以下幾個步驟:

  1. 首先,瀏覽器發送請求到服務器,請求的資源可能是一個網頁、css 檔案、JavaScript 檔案或者其他型別的檔案;

  2. 當服務器接收到請求后,首先檢查請求中的快取策略,例如請求頭中的 Cache-Controlexpires 欄位;

  3. 如果資源被標記為強快取,服務器會進行以下判斷:

    • 如果快取有效,即資源的過期時間未到達或過期時間在當前時間之后,服務器回傳狀態碼為 200 ok,并在回應頭中設定適當的快取策略,例如設定 Cache-ControlExpires 欄位,告訴瀏覽器可以使用本地快取;
    • 如果快取無效,即資源的過期時間已過或過期時間在當前時間之前,服務器回傳新的資源,狀態碼為 200 ok,并在回應頭中設定適當的快取策略;
  4. 如果資源未被標記為強快取或快取驗證失敗,服務器進行協商快取的判斷:

    • 如果請求頭中包含 If-Modified-Since 欄位,表示瀏覽器之前快取了該組員并記錄了最后修改時間,服務器會根據資源的最后修改時間進行判斷;
      • 如果資源的最后修改時間與 If-Modified-Since 欄位的值相同或更早,服務器回傳狀態碼 304 Not Modified,并在回應頭中清除實際的回應頭;
      • 如果資源的最后修改時間晚于 If-Modified-Since 欄位的值,表示資源已經發生了變化,服務器回傳新的資源,狀態碼為 200 ok,并在回應頭中設定新的最后修改時間;
    • 如果請求頭中包含 If-None-Match 欄位,表示瀏覽器之前快取了該資源并記錄資源的 ETag 值,服務器會根據資源的 ETag 進行判斷:
      • 如果資源的 ETagIf-None-Match 欄位的值相同,服務器回傳狀態碼 304 Not Modified,并在回應頭中清除實際的回應體;
      • 如果資源的 ETagIf-None-Match 欄位的值不同,表示資源已經發生了變化,服務器回傳新的資源,狀態碼為 200 OK,并在回應頭中設定新的 ETag;
  5. 瀏覽器接收到服務器的回應之后,根據狀態碼和回應頭資訊進行相應的處理:

    • 如果狀態碼為 200 OK,表示服務器回傳了新的資源,瀏覽器使用新的資源并更新本地快取;
    • 如果狀態碼為 304 Not Modified,表示資源未發生變化,瀏覽器使用本地快取的副本;
    • 瀏覽器根據回應頭中的快取策略進行進一步處理:
      • 如果回應頭中包含 Cache-Control 欄位,瀏覽器根據其指令執行快取策略,例如,如果回應頭中的 Cache-Control 包含 no-cache,瀏覽器將不使用本地快取,而是向服務器發送請求獲得最新的資源;
      • 如果回應頭中包含 Expires 欄位,瀏覽器將與當前時間比較,判斷資源的過期時間,如果過期時間已過,瀏覽器將不使用本地快取,而是向服務器發送請求獲取最新的資源;
      • 如果回應頭中包含其他相關的快取控制欄位(如 ETag),瀏覽器可以根據這些欄位進行更精確的快取控制和驗證;

其中,在上面的流程中,又有幾個令人難懂的欄位,主要有以下幾個:

  1. ETag: 它是通過對比瀏覽器和服務器資源的特征值來決定是否要發送檔案內容,如果一樣就只發送 304 Not Modified;
  2. Expires: 設定過期時間,是絕對時間;
  3. Last-Modified: 以時刻作為標識,無法識別一秒內進行多次修改的情況,只要資源修改,無論內容是否發生實質性變化,都會將該資源回傳客戶端;
  4. If-None-Match: 當客戶端發送 GET 請求時,如果之前已經鍵相用資源的請求時,并且服務器回傳了 ETag,那么客戶端可以將 ETag 的值添加到 If-None-Match 頭中,當再次請求該資源時,客戶端會將 If-None-Match 頭發送給服務器,服務器收到請求之后,會檢查 If-None-Match 投中的值是否與當前資源的 ETag 值匹配:
    • 如果匹配,則表示客戶端所請求的資源沒有發生變化,服務器會回傳狀態碼 304 Not Modified,并且不回傳實際的資源內容;
    • 如果 If-None-Match 頭中的值與服務器上資源的 ETag 值不匹配,說明資源發生了變化,服務器會正常回傳資源,并回傳狀態碼 200 OK;

圖解強快取和協商快取

在上面的內容中講了這么多的理論, 你是否還是不太理解什么是 強快取協商快取 啊,那么接下來我們就用幾張圖片來弄清楚這兩者的區別,

強快取

強快取就是檔案直接從本地快取中獲取,不需要發送請求,

首次請求

當瀏覽器發送初次請求時,瀏覽器會向服務器發起請求,服務器接收到瀏覽器的請求后,回傳資源并回傳一個 Cache-Control 欄位給客戶端,在該欄位中設定一些快取相關的資訊,例如最大過期時間,

再次請求

在前面的基礎上,瀏覽器再次發送請求,瀏覽器一節接收到 Cache-Control 的值,那么這個時候瀏覽器它會首先檢查它的 Cache-Control 是否過期,如果沒有過期則直接從本地快取中拉取資源,回傳割到客戶端,則無需再經過服務器,

快取失效

強快取有過期時間,那么就意味著總有一天快取會失效,如果客戶端的 Cache-Control 失效了,那么它就會像首次請求中一樣,重新向服務器發起請求,之后服務器會再次回傳資源和 Cache-Control 的值,

協商快取

協商快取也叫做對比快取,服務端判斷客戶端的資源是否和服務端的一樣,如果一樣則回傳 304,反之回傳 200 和最新的資源,

初次請求

如果客戶端是第一次向服務器發出請求,則服務器回傳資源和對應的資源標識給瀏覽器,該資源標識就是對當前所回傳資源的唯一標識,可以是 ETag 或者是 Last-Modified

之后如果瀏覽器再次發送請求是,瀏覽器就會帶上這個資源表,此時服務端就會通過這個資源標識,可以判斷出瀏覽器的資源跟服務器此時的資源是否一致,如果一致則回傳 304 Not Modified,如果不一致,則回傳 200,并回傳資源以及新的資源標識,

不同重繪操作方式,對強制快取和協商快取的影響

不同的重繪操作方式對于強制快取和寫上快取的影響如下:

  1. 普通重繪(F5重繪按鈕):

    • 強制快取的影響: 瀏覽器忽略強制快取,直接向服務器發送請求,獲取最新的資源,也就是強制快取失效;
    • 協商快取的影響: 瀏覽器放帶有快取驗證的欄位的請求,瀏覽器會根據驗證結果回傳新的資源或者 304 Not Modified;
  2. 強制重繪(Ctrl+F5Shift+重繪按鈕):

    • 強制快取的影響: 同上,強制快取失效;
    • 協商快取的影響: 瀏覽器發送不帶快取驗證欄位的請求,服務器回傳新的資源,不進行驗證,也就是協商快取失效;
  3. 禁用快取重繪(DevTools 中的 Disable cacheNetwork 勾選 Disable cache):

    • 強制快取的影響: 同上,強制快取失效;
    • 協商快取的影響: 瀏覽器會發送帶有快取驗證欄位的請求,服務器會根據驗證結果回傳新的資源或 304 Not Modified;

這玩意也就圖一樂,一般出現了問題我都是直接重啟......

總結

總的來說,強制快取是通過在請求中添加快取策略,判斷快取是否有效,避免發送請求到服務器,而協商快取是通過條件請求與服務器進行通信,驗證快取是否仍然有效,并在服務器回傳適當的回應狀態碼和快取策略,

強制快取可以減少對服務器的請求,加快資源加載速度,但可能無法獲取到最新的資源,協商快取能夠驗證資源的有效性,并在需要時獲取最新的資源,但會增加對服務器的請求,選擇使用哪種快取策略取決于具體的應用場景和資源的特性,

本文轉載于:

https://juejin.cn/post/7248235392284721209

如果對您有所幫助,歡迎您點個關注,我會定時更新技術檔案,大家一起討論學習,一起進步,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/555955.html

標籤:Html/Css

上一篇:車規級耐高溫BLE5.2協議串口轉藍牙模塊E104-BT53C3產品簡介

下一篇:返回列表

標籤雲
其他(161602) Python(38248) JavaScript(25513) Java(18259) C(15238) 區塊鏈(8272) C#(7972) AI(7469) 爪哇(7425) MySQL(7266) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2437) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1972) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 記錄--強制快取這么暴力,為什么不使用協商快取

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前段時間在看面經的時候,發現很多份面經中都被問到了 強快取 和 協商快取。因此我覺得有必要寫一篇文章來好好聊聊這兩者。 強快取和協商快取 瀏覽器快取是瀏覽器在本地磁盤對用戶最近請求過的檔案進行存盤,當訪問者再次訪問同一頁面時,瀏覽器就可以 ......

    uj5u.com 2023-06-26 09:03:19 more
  • 車規級耐高溫BLE5.2協議串口轉藍牙模塊E104-BT53C3產品簡介

    藍牙耐高溫車規級BLE5.2藍牙協議串口轉藍牙模塊E104-BT53C3新品即將上架: 藍牙模塊通信介面:UART串口通信 藍牙模塊作業頻率:2402~2480MHz 車規級藍牙模塊藍牙協議:BLE 5.2 通信距離:170m 天線介面:PCB 產品尺寸:23*16mm 產品簡介:E104-BT53 ......

    uj5u.com 2023-06-26 08:57:48 more
  • 驅動開發:內核遠程執行緒實作DLL注入

    在筆者上一篇文章`《驅動開發:內核RIP劫持實作DLL注入》`介紹了通過劫持RIP指標控制程式執行流實作插入DLL的目的,本章將繼續探索全新的注入方式,通過`NtCreateThreadEx`這個內核函式實作注入DLL的目的,需要注意的是該函式在微軟系統中未被匯出使用時需要首先得到該函式的入口地址,... ......

    uj5u.com 2023-06-26 08:57:32 more
  • 車規級耐高溫BLE5.2協議串口轉藍牙模塊E104-BT53C3產品簡介

    藍牙耐高溫車規級BLE5.2藍牙協議串口轉藍牙模塊E104-BT53C3新品即將上架: 藍牙模塊通信介面:UART串口通信 藍牙模塊作業頻率:2402~2480MHz 車規級藍牙模塊藍牙協議:BLE 5.2 通信距離:170m 天線介面:PCB 產品尺寸:23*16mm 產品簡介:E104-BT53 ......

    uj5u.com 2023-06-26 08:56:54 more
  • 驅動開發:內核遠程執行緒實作DLL注入

    在筆者上一篇文章`《驅動開發:內核RIP劫持實作DLL注入》`介紹了通過劫持RIP指標控制程式執行流實作插入DLL的目的,本章將繼續探索全新的注入方式,通過`NtCreateThreadEx`這個內核函式實作注入DLL的目的,需要注意的是該函式在微軟系統中未被匯出使用時需要首先得到該函式的入口地址,... ......

    uj5u.com 2023-06-26 08:56:15 more
  • 百度Amis+React低代碼實踐

    ### 背景 在專案中有集成低代碼平臺的想法,經過多方對比最后選擇了 amis,主要是需要通過 amis 進行頁面配置,匯出 json 供移動端和 PC 端進行渲染,所以接下來講一下近兩周研究 amis 的新的以及一些簡單經驗,供大家參考. ### 什么是 amis amis 是一個低代碼前端框架, ......

    uj5u.com 2023-06-25 08:11:15 more
  • React SSG - 也寫個 Demo 吧

    上次寫了一個 `SSR` 的 `DEMO`,今天寫個小 `Demo` 來從頭實作一下 `react` 的 `SSG`,來理解下 `SSG` 是如何實作的。 ## 什么是 SSG `SSG` 即 `Static Site Generation` 靜態站點生成,是指將在構建時就提前生成靜態 `HTML` ......

    uj5u.com 2023-06-25 08:11:05 more
  • 驅動開發:摘除InlineHook內核鉤子

    在筆者上一篇文章`《驅動開發:內核層InlineHook掛鉤函式》`中介紹了通過替換`函式`頭部代碼的方式實作`Hook`掛鉤,對于ARK工具來說實作掃描與摘除`InlineHook`鉤子也是最基本的功能,此類功能的實作一般可在應用層進行,而驅動層只需要保留一個`讀寫位元組`的函式即可,將復雜的流程放... ......

    uj5u.com 2023-06-25 08:05:06 more
  • 驅動開發:摘除InlineHook內核鉤子

    在筆者上一篇文章`《驅動開發:內核層InlineHook掛鉤函式》`中介紹了通過替換`函式`頭部代碼的方式實作`Hook`掛鉤,對于ARK工具來說實作掃描與摘除`InlineHook`鉤子也是最基本的功能,此類功能的實作一般可在應用層進行,而驅動層只需要保留一個`讀寫位元組`的函式即可,將復雜的流程放... ......

    uj5u.com 2023-06-25 07:59:01 more
  • 曾經辛苦造的輪子,現在能否用 ChatGPT 替代呢?

    上一篇文章 [我在 vscode 插件里接入了 ChatGPT,解決了代碼變數命名的難題](https://www.cnblogs.com/jaycewu/p/17476198.html) 中,展示了如何在 vscode 插件中使用 ChatGPT 解決代碼變數命名的問題。vscode 插件市場中有 ......

    uj5u.com 2023-06-24 08:01:15 more