一. 強緩存和協商緩存瀏覽器
第一次請求資源時,會根據http頭部信息判斷是否緩存;緩存
第二次請求資源時,會先判斷是否命中強緩存(Cache-Control和Expires),若是是則直接獲取資源,本次請求不會與服務器進行通訊;若是沒有命中,則會攜帶第一次請求時返回有關緩存的頭部信息(Last-Modified/If-Modified-Since 和 Etag/If-None-Match);若命中則直接獲取緩存資源,不然獲取新資源。服務器
|
狀態碼 |
與服務器通訊 |
強緩存(本地緩存) |
200(from cache) |
否,直接取緩存 |
協商緩存 |
304(not modified) |
是,經過服務器判斷緩存是否可用 |
二. 強緩存headercookie
- Expires:http1.0,GMT格式的時間字符串,緩存有效的截止時間;
- Cache-Control:max-age=10000:http1.1,相對值,資源第一次請求時間和設定的有效期計算出一個資源過時時間,再拿這個時間和當前時間比較;
還有幾個經常使用值no-cache(不使用強緩存),no-store(禁止緩存數據),public(可被全部用戶緩存),private(只容許終端用戶緩存);
- Cache-Control優先級高於Expires;
三. 協商緩存headersession
- 第一次請求響應頭帶上Last-Modified/Etag,則後續請求會帶上If-Modified/If-None-Match;
- Last-Modified:GMT格式,最後修改時間;
If-Modified-Since:也是GMT格式,判斷而這是否同樣;若是命中緩存,則返回304,而且不會返回資源內容,不會返回Last-Modify;
- Etag/If-None-Match:服務器生成的惟一標識字符串,與Last-Modified不一樣的是,當服務器返回304時,因爲Etag從新生成過,因此頭部信息仍是會把這個Etag返回,即便沒變化;
- 爲何有了Last-Modified還要Etag:一些文件週期性更改,但內容不變;有些文件修改頻繁,1s內修改屢次;某些服務器不能精確獲得文件最後修改時間;Etag優先於Last-Modified驗證。
四. cookie & session & localStorage & sessionStorage資源
- cookie一般保存在瀏覽器,session一般保存在服務器端,通常來講當服務器收到請求要建立session時,首先會在客戶端監測是否包含sessionid,若是有則根據id返回session;沒有的話建立新的sessionid並相應給客戶端;一般使用cookie存儲sessionid。
- 單個cookie不超過4kb,session無大小限制;
- localStorage和sessionStorage通常都是5Mb,前者是永久的,後者關閉頁面即失效;通用方法:setItem(key, value),getItem(key),removeItem(key),clear(),key(index);