你們好,我是林一一,這是一篇關於瀏覽器 緩存原理 和 本地存儲 的文章,後續回持續推出關於,瀏覽器原理的文章。
所謂瀏覽器的緩存,就是瀏覽器經過HTTP
請求網絡資源後將資源留在本地的一種行爲。在頁面上點擊返回和前進的按鈕
就是利用瀏覽器的緩存。
強緩存
和 協商緩存
。Service Worker, Memory Cache, Disk Cache, Push Cache
。Service Worker
優先級最高到 Push Cache
。先本地再服務器(先強緩存再協商緩存)
header
是否有命中強緩存,若是命中強緩存則直接請求本地的資源,不向服務器發送請求。若是沒有命中強緩存或強緩存失效之後就會發送 HTTP
請求服務器,這個過程採用的就是協商緩存
前端
簡單的說瀏覽器的緩存請求分爲有無
HTTP
請求兩種。
所謂的強緩存是咱們沒有發送
HTTP
請求,而是直接從本地緩存中獲取資源的一種行爲。成功後返回狀態碼 200。
headers
字段判斷 Expires/http1.0
,Cache-Control/http1.1
,來執行強緩存的過程。沒有或失效的強緩存,瀏覽器會向服務器發送請求資源。web
http1.0 中一個頁面的緩存字段,是一個格林時間。這個時間是瀏覽器強緩存資源失效的時間
Expires: Wed, 22 Nov 2021 08:41:00 GMT
上面的表示緩存的資源會在
2021年11月22號8點41分
過時。
HTTP1.1
時 Expires
被放棄了。
HTTP1.1 中頁面的緩存字段。 若是Expires和Cache-Control
都存在,那麼Cache-Control
的優先級更高。
Cache-Control
的屬性值有不少,其中屬性 max-age
表示,一個相對的緩存時間sql
Cache-Control: max-age = 3600
表示距離上次請求的一小時內能夠直接使用本地的緩存。不須要再次請求。
public
表示能夠被瀏覽器或代理服務器緩存。private
表示只能被瀏覽器緩存。no-cache
須要發送請求到服務器確認是否被緩存,這須要使用到協商緩存。no-store
表示禁止使用緩存,每一次都須要請求服務器。所謂協商緩存是指:瀏覽器攜帶緩存的標識 tag
向服務器發送請求,服務器更具攜帶過來的標識判斷是否使用緩存的這個過程就是協商緩存
。
304
表示服務器的資源尚未更新直接使用瀏覽器本地的緩存便可。另外一種返回 200
,表示服務器資源更新且攜帶新的資源返回給瀏覽器。tag
分紅兩種 Last-Modified/If-Modified-Since
和 ETag/If-None-Match
,Etag / If-None-Match
的優先級高於 Last-Modified
。
Etag 時服務器響應請求時 返回的一個惟一標識。這個標識只能由服務器產生。數據庫
etag: W/"5357d2b3f63545926812b95658505315"
Etag
標識值發送給服務器,服務器會將這個值和在服務器中的Etag
比較,兩個值相等那麼返回304
,若是不相等就返回 200
將新的資源返回。Last-Modified,指的是返回請求的資源文件最後在服務器被修改的時間。segmentfault
Last-Modified: Wed, 23 Nov 2021 08:41:00 GMT
Last-Modified
的時間發送給服務器。服務器將上一次最後修改的時間 和如今的最後修改的時間作對比。若是大於If-Modified-Since
的值,服務器就會返回新的資源 200,不然返回 304
。
上面提到過緩存的位置Service Worker, Memory Cache, Disk Cache, Push Cache
。Service Worker
優先級最高到Push Cache
HTTPS
。session
中,存活的時間很短。
瀏覽器的本地緩存主要分爲 5 種,
localStorage, sessionStorage, cookie, WebSql, indexedDB
。
cookie 是服務器生成的,保存到瀏覽器的一個本地文件中。前端能夠經過Set-Cookie
設置 cookie,前端能夠設置多個Set-Cookie
。
cookie 能夠設置過時的時間也能夠不設置時間,瀏覽器關閉後就會失效。瀏覽器
Set-Cookie: BDSVRTM=7; path=/ Set-Cookie: H_PS_PSSID=34130_34099_33969_31253_33848_33607_26350; path=/; domain=.baidu.com
狀態存儲
的,由於 http 是無狀態的,不能記錄數據狀態,cookie 能夠記錄數據的狀態。好比用戶的id,密碼,瀏覽過的頁面等。4kb
大小;2.安全問題,cookie是以文本的形式在瀏覽器和服務器以前傳遞信息,頗有可能會被修改。3. 請求的Cookie文件容易被刪除。 4. 性能消耗大,cookie 是緊跟域名的,域名下的任意地址被修改都攜帶cookie到服務器。形成性能浪費。localStorage
存值的方式和 cookie 相似,都會存放在同一個域名下,localStorage 能夠長期存儲,沒有時間的限制。能夠經過localStorage.setItem()/getItem()
存取值。
JSON.stringify()
轉化。sessionStorage 和 localStorage 一致,惟一大的區別在於 sessionStorage 是會話級別的存儲
sessionStorage
也就是在瀏覽器頁面關閉後,這個存儲也就消失了。瀏覽器提供的非關係型數據庫,indexedDB 提供大量的接口提供查詢功能,還能創建查詢。
已廢棄,旨在經過 js 語句操控 sql 語句完成對數據的讀寫。
《圖解HTTP》緩存
瀏覽器緩存安全
前端緩存服務器
本地存儲cookie