摘要:如果發送請求的時間在之前,那么本地緩存始終有效,否則就會發送請求到服務器來獲取資源。不使用本地緩存,需要使用協商緩存。直接禁止瀏覽器緩存數據。
每天系統復習一個知識點 http緩存
http緩存主要分為了兩類 強緩存(本地緩存)和協商緩存
瀏覽器在請求某一資源時,會先獲取改資源緩存的header信息,判斷是否命中強緩存(expires的信息和cache-control)若命中直接從緩存中獲取該資源信息,包括緩存header信息,本次請求根本就不會與服務器進行通信。此為強緩存(本地緩存)
如果沒有命中強緩存,瀏覽器會發送請求到服務器,請求會攜帶第一次請求返回的的有關緩存的header字段信息(last-modified/if-modified-since 和 Etag/if-none-Match),由服務器根據請求中相關header信息來比對結果是否協商緩存命中,若命中,則服務器返回新的響應header信息更新緩存中的對應header信息,但是并不返回資源內容,它會告知瀏覽器可以直接從緩存獲取,否則返回最新的資源內容。
獲取資源形式 狀態碼 發送請求到服務器
強緩存 從緩存取 200(from cache) 否,直接從緩存取
協商緩存 從緩存取 304(not modified) 是,正如其名,通過服務器來告知緩存是否可用
1 expires,這是http1.0的規范,它的值為一個絕對時間的GMT格式的時間字符串,如Mon, 10 Jun 2015 21:31:12 GMT。如果發送請求的時間在expires之前,那么本地緩存始終有效,否則就會發送請求到服務器來獲取資源。
2 cache-control:max-age=number,這是Http1.1時出現的header信息。主要是利用該字段的max-age值來進行判斷。它是一個相對值,資源第一次的請求時間和cache-control設定的有效期,計算出一個資源過期時間。再拿這個過期時間跟當前的請求時間比較,如果請求時間在過期時間之前,就能命中緩存,否則就不行,cache-control除了該字段外,還有下面幾個比較常用的設置值。
no-cache : 不使用本地緩存,需要使用協商緩存。
no-store : 直接禁止瀏覽器緩存數據。(強緩存和協商緩存都不行),每次用戶請求該資源,都會向服務器發送一個請求,每次都會下載完整的資源。(常用于銀行等重要業務)
public : 可以被所有的用戶緩存,包括終端用戶和cdn等中間代理服務器
private : 只能被終端用戶緩存,不允許CDN等中繼緩存服務器對其緩存
注意:如果cache-control與expires同時存在的話,cache-control的優先級高于expires。
協商緩存協商緩存都是由服務器來確定緩存資源是否可用的,所以客戶端與服務器端通過某種標識進行通信,從而讓服務器判斷請求資源是否可以緩存訪問,
這里涉及到下面兩組header字段。這兩組搭檔都是成對出現的,即第一次請求的響應頭帶上某個字段(last-modified或者ETag),則后續請求則會帶上對應的請求字段(if-modified-since或者if-none-match),若響應頭沒有last-modified或者Etag字段,則請求頭也不會有對應的字段。
1,第一次和服務器交互,服務器返回資源 在response的header加上last-modified的header.這個header表示這個資源在服務器上的最后修改時間
2,第二次請求這個資源,瀏覽器會在request header加上if-modified-since的header.這個header的值就是上一次請求時返回的last-modified的值。服務器再次收到資源請求。根據瀏覽器傳過來的if-modified-since和資源在服務器上的最后修改時間判斷資源是否有變化,如果沒有發生變化則返回
304 not modified .但是不會返回資源內容。如果有變化,就正常返回資源內容和更新last-modified字段。當服務器返回304 not modified的響應時,response header中不會再添加last-modified的字段。因為既然資源沒有變化,那么last-modified也就不會改變.
Etag/if-none-Match
這兩個值是由服務器生產的每一個資源的唯一標識字符串,只要資源有變化就這個值就會改變,其判斷過程和last-modified/if-modified-since類似,與last-modified不一樣的是。當服務器返回304 not
modified的響應 response header中還會把這個etag返回,即使這個eTag跟之前沒有變化。
**Etag比較的是文件資源的特征值,而Last-Modifield則比較的是文件資源的最后的修改時間。這兩個其實是相輔相成的,不是有了Etag就不該有Last-Modifield,有了Last-Modifield就不該有Etag,同時傳入服務器時,服務器會根據自己的緩存機制進行選擇要使用哪個,甚至可以兩個都進行參考
比如img肯定判斷last-modified更方便。其他文件可能比較etag更方便
**
你可能會覺得使用last-modified已經足以讓瀏覽器知道本地的緩存副本是否足夠新,為什么還要Etag呢。http1.1 etag的出現主要是為了解決幾個last-modifed比較難解決的問題:
1 一些文件也行會周期性的更改,但是他的內容并不改變(僅僅改變的修改時間),這個時候我們并不希望客戶端認為這個文件被修改了,而重新GET;
2 某些文件修改非常頻繁,比如在秒以下的時間內進行修改(比方說1s內修改N次)if-modified-since能檢查到的粒度是s級的,這種修改無法判斷(unix記錄mtime只能精確到秒)
3 某些服務器不能精確得到文件的最后修改時間。
不能緩存的請求文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100264.html
摘要:本文總結了前端老司機經常問題的一些問題并結合個人總結給出了比較詳盡的答案。網易阿里騰訊校招社招必備知識點。此外還有網絡線程,定時器任務線程,文件系統處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機制叫做事件循環。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結了前端老司機經常問題的一些問題并結合個...
摘要:本文總結了前端老司機經常問題的一些問題并結合個人總結給出了比較詳盡的答案。網易阿里騰訊校招社招必備知識點。此外還有網絡線程,定時器任務線程,文件系統處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機制叫做事件循環。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結了前端老司機經常問題的一些問題并結合個...
摘要:本文總結了前端老司機經常問題的一些問題并結合個人總結給出了比較詳盡的答案。網易阿里騰訊校招社招必備知識點。此外還有網絡線程,定時器任務線程,文件系統處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機制叫做事件循環。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結了前端老司機經常問題的一些問題并結合個...
摘要:接下來的內容中我們將通過緩存位置緩存策略以及實際場景應用緩存策略來探討瀏覽器緩存機制。是運行在瀏覽器背后的獨立線程,一般可以用來實現緩存功能。在所有瀏覽器緩存中,覆蓋面基本是最大的。 一、前言 緩存可以說是性能優化中簡單高效的一種優化方式了。一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,并且由于緩存文件可以重復利用,還可以減少帶寬,降低網絡負荷。對于一個數據請求來說,可以分為...
閱讀 2574·2021-10-08 10:04
閱讀 2735·2021-09-06 15:02
閱讀 792·2019-08-30 13:50
閱讀 1547·2019-08-30 13:21
閱讀 2586·2019-08-30 11:15
閱讀 2113·2019-08-29 17:19
閱讀 1574·2019-08-26 13:55
閱讀 1261·2019-08-26 10:15