瀏覽器雖然發現了本地有該資源的緩存,可是不肯定是不是最新的,因而想服務器詢問,若服務器認爲瀏覽器的緩存版本還可用,那麼便會返回304。瀏覽器
瀏覽器緩存分爲強緩存和協商緩存。
1.瀏覽器請求某資源,經過header判斷是否強緩存,如果強緩存,則從本地直接獲取緩存文件,不發請求到瀏覽器
2.若不是強緩存,發送請求到服務器,服務器經過一些request header肯定是不是協商緩存,若是是,服務器將請求返回,但不返回資源,而是讓客戶端從本地緩存獲取資源
3.強緩存和協商緩存,資源都是本地,只是強緩存不會發送請求到服務器,協商緩存會發送請求到服務器。
4.不是協商緩存,則瀏覽器將資源發送客戶端。
http緩存
強緩存:服務端第一次響應請求時,告知瀏覽器還存在本地,設定時間,時間以內還獲取該資源就從本地獲取。
Expires Cache-Control兩個響應首部字段告知過時時間和最大生命週期。再次請求從緩存中找資源,若請求時間比Expires設定時間早則可用本地資源。
http1.1 Cache-Control緩存資源最大生命週期,秒爲單位。
一塊兒使用以Cache-Control爲主。
協商緩存:文件最後修改時間,服務器判斷資源是否更新,未更新返回304表示not modified,瀏覽器從緩存加載。
LastModified:資源最後更新時間,隨服務器返回。if-modified-Since請求首部字段,經過比較兩個時間判斷資源是否修改。沒有修改則協商緩存。
1.瀏覽器第一次請求資源,服務器響應,返回資源,響應頭加Last-Modified。
2.瀏覽器再次請求資源,在請求頭加上if modified since,該值爲上次Last-Modified的值
3.服務器接受請求,將ifmodifiedsince值和資源最後修改值作對比,若一致則返回304,協商緩存。
Etag週期性重寫資源,但資源沒變化,加註釋等可有可無信息。用Etag區分兩個資源是否一致,隨response返回和請求頭的if-none-match相比較,判斷資源在兩次請求中是否修改,未修改則協商緩存。
還有三種緩存方式:application cache,cookie,localstorage,sessionstorage