摘要:用戶發(fā)起了一個請求后,瀏覽器發(fā)現(xiàn)先本地已有所請求資源的緩存,便開始檢查緩存是否過期。表明只有特定用戶才能使用緩存,適用于公共緩存服務(wù)器的情況。用戶行為最后附一張圖說明用戶行為對瀏覽器緩存的影響
參閱了一些瀏覽器緩存的資料,本文通過一張圖來歸納總結(jié)其過程。
瀏覽器第一次向一個web服務(wù)器發(fā)起http請求后,服務(wù)器會返回請求的資源,并且在響應(yīng)頭中添加一些有關(guān)緩存的字段如:Cache-Control、Expires、Last-Modified、ETag、Date等等。之后瀏覽器再向該服務(wù)器請求該資源就可以視情況使用強緩存和協(xié)商緩存。
強緩存:瀏覽器直接從本地緩存中獲取數(shù)據(jù),不與服務(wù)器進行交互。
協(xié)商緩存:瀏覽器發(fā)送請求到服務(wù)器,服務(wù)器判定是否可使用本地緩存。
聯(lián)系與區(qū)別:兩種緩存方式最終使用的都是本地緩存;前者無需與服務(wù)器交互,后者需要。
下面假定瀏覽器已經(jīng)訪問了服務(wù)器,服務(wù)器返回了緩存相關(guān)的頭部字段且瀏覽器已對相關(guān)資源做好緩存。通過下圖來分析強緩存和協(xié)商緩存:
強緩存如圖紅線所示的過程代表強緩存。用戶發(fā)起了一個http請求后,瀏覽器發(fā)現(xiàn)先本地已有所請求資源的緩存,便開始檢查緩存是否過期。有兩個http頭部字段控制緩存的有效期:Expires和Cache-Control,瀏覽器是根據(jù)以下兩步來判定緩存是否過期的:
查看緩存是否有Cache-Control的s-maxage或max-age指令,若有,則使用響應(yīng)報文生成時間Date + s-maxage/max-age獲得過期時間,再與當(dāng)前時間進行對比(s-maxage適用于多用戶使用的公共緩存服務(wù)器);
如果沒有Cache-Control的s-maxage或max-age指令,則比較Expires中的過期時間與當(dāng)前時間。Expires是一個絕對時間。
注意,在HTTP/1.1中,當(dāng)首部字段Cache-Control有指定s-maxage或max-age指令,比起首部字段Expires,會優(yōu)先處理s-maxage或max-age。
另外下面列幾個Cache-Control的常用指令:
no-cache:含義是不使用本地緩存,需要使用協(xié)商緩存,也就是先與服務(wù)器確認(rèn)緩存是否可用。
no-store:禁用緩存。
public:表明其他用戶也可使用緩存,適用于公共緩存服務(wù)器的情況。
private:表明只有特定用戶才能使用緩存,適用于公共緩存服務(wù)器的情況。
經(jīng)過上述兩步判斷后,若緩存未過期,返回狀態(tài)碼為200,則直接從本地讀取緩存,這就完成了整個強緩存過程;如果緩存過期,則進入?yún)f(xié)商緩存或服務(wù)器返回新資源過程。
協(xié)商緩存當(dāng)瀏覽器發(fā)現(xiàn)緩存過期后,緩存并不一定不能使用了,因為服務(wù)器端的資源可能仍然沒有改變,所以需要與服務(wù)器協(xié)商,讓服務(wù)器判斷本地緩存是否還能使用。此時瀏覽器會判斷緩存中是否有ETag或Last-Modified字段,如果沒有,則發(fā)起一個http請求,服務(wù)器根據(jù)請求返回資源;如果有這兩個字段,則在請求頭中添加If-None-Match字段(有ETag字段的話添加)、If-Modified-Since字段(有Last-Modified字段的話添加)。注意:如果同時發(fā)送If-None-Match 、If-Modified-Since字段,服務(wù)器只要比較If-None-Match和ETag的內(nèi)容是否一致即可;如果內(nèi)容一致,服務(wù)器認(rèn)為緩存仍然可用,則返回狀態(tài)碼304,瀏覽器直接讀取本地緩存,這就完成了協(xié)商緩存的過程,也就是圖中的藍(lán)線;如果內(nèi)容不一致,則視情況返回其他狀態(tài)碼,并返回所請求資源。下面詳細(xì)解釋下這個過程:
1.ETag和If-None-Match二者的值都是服務(wù)器為每份資源分配的唯一標(biāo)識字符串。
瀏覽器請求資源,服務(wù)器會在響應(yīng)報文頭中加入ETag字段。資源更新時,服務(wù)器端的ETag值也隨之更新;
瀏覽器再次請求資源時,會在請求報文頭中添加If-None-Match字段,它的值就是上次響應(yīng)報文中的ETag的值;
服務(wù)器會比對ETag與If-None-Match的值是否一致,如果不一致,服務(wù)器則接受請求,返回更新后的資源;如果一致,表明資源未更新,則返回狀態(tài)碼為304的響應(yīng),可繼續(xù)使用本地緩存,要注意的是,此時響應(yīng)頭會加上ETag字段,即使它沒有變化。
2.Last-Modified和If-Modified-Since二者的值都是GMT格式的時間字符串。
瀏覽器第一次向服務(wù)器請求資源后,服務(wù)器會在響應(yīng)頭中加上Last-Modified字段,表明該資源最后一次的修改時間;
瀏覽器再次請求該資源時,會在請求報文頭中添加If-Modified-Since字段,它的值就是上次服務(wù)器響應(yīng)報文中的Last-Modified的值;
服務(wù)器會比對Last-Modified與If-Modified-Since的值是否一致,如果不一致,服務(wù)器則接受請求,返回更新后的資源;如果一致,表明資源未更新,則返回狀態(tài)碼為304的響應(yīng),可繼續(xù)使用本地緩存,與ETag不同的是:此時響應(yīng)頭中不會再添加Last-Modified字段。
3.ETag較之Last-Modified的優(yōu)勢以下內(nèi)容引用于:http協(xié)商緩存VS強緩存
你可能會覺得使用Last-Modified已經(jīng)足以讓瀏覽器知道本地的緩存副本是否足夠新,為什么還需要ETag呢?HTTP1.1中ETag的出現(xiàn)主要是為了解決幾個Last-Modified比較難解決的問題:
一些文件也許會周期性的更改,但是他的內(nèi)容并不改變(僅僅改變的修改時間),這個時候我們并不希望客戶端認(rèn)為這個文件被修改了,而重新GET;
某些文件修改非常頻繁,比如在秒以下的時間內(nèi)進行修改,(比方說1s內(nèi)修改了N次),If-Modified-Since能檢查到的粒度是s級的,這種修改無法判斷(或者說UNIX記錄MTIME只能精確到秒);
某些服務(wù)器不能精確的得到文件的最后修改時間。
這時,利用ETag能夠更加準(zhǔn)確的控制緩存,因為ETag是服務(wù)器自動生成的資源在服務(wù)器端的唯一標(biāo)識符,資源每次變動,都會生成新的ETag值。Last-Modified與ETag是可以一起使用的,但服務(wù)器會優(yōu)先驗證ETag。
用戶行為最后附一張圖說明用戶行為對瀏覽器緩存的影響:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/62014.html
摘要:從效率上來說,它是響應(yīng)速度最快的一種緩存。緩存緩存分為強緩存和協(xié)商緩存。是指在階段存在的緩存。服務(wù)器緩存,即內(nèi)容分發(fā)網(wǎng)絡(luò)指的是一組分布在各個地區(qū)的服務(wù)器。的核心點有兩個,一個是緩存,一個是回源。作用域和都遵循同源策略。 showImg(https://segmentfault.com/img/bVbocad?w=1297&h=1081); 1 瀏覽器緩存 瀏覽器緩存機制有四個方面,它們...
摘要:注意如果用戶一開始沒有微信授權(quán),生成海報時又必須要用戶頭像不能使用默認(rèn)的話,那就只能老老實實走之前的流程了。組件名稱終端類型微信版本觸發(fā)方法關(guān)于的調(diào)用方法相冊權(quán)限需要你提供保存相冊權(quán)限獲取相冊權(quán)限成功,給出再次點擊圖片保存到相冊的提示。 showImg(https://segmentfault.com/img/bVbs5V8?w=343&h=517);海報生成示例 海報生成速度緩慢...
摘要:導(dǎo)語智能手機發(fā)展到今天已經(jīng)有十幾個年頭,手機的軟硬件都已經(jīng)發(fā)生了翻天覆地的變化,特別是陣營,從一開始的一兩百到今天動輒,內(nèi)存。恰好最近做了內(nèi)存優(yōu)化相關(guān)的工作,這里也對內(nèi)存優(yōu)化相關(guān)的知識做下總結(jié)。 導(dǎo)語 智能手機發(fā)展到今天已經(jīng)有十幾個年頭,手機的軟硬件都已經(jīng)發(fā)生了翻天覆地的變化,特別是Android陣營,從一開始的一兩百M到今天動輒4G,6G內(nèi)存。然而大部分的開發(fā)者觀看下自己的異常上報系...
摘要:要搞清這三種關(guān)系指向之間的關(guān)系拗口,其實也就是要搞懂,構(gòu)造函數(shù)由構(gòu)造函數(shù)操作創(chuàng)造出的實例對象和構(gòu)造函數(shù)的原型對象之間的關(guān)系。 寫在前面 這篇博客來源于,有天mentor突然傳給我了這張祖?zhèn)鞯膱D片,并且發(fā)誓一定要給我講清楚,然鵝在他的一番激情講解之后,他自己也被繞懵了...于是后來我決定整理一下似乎還有點清晰的思路,記錄一下我對這張圖的理解。作為一個小白,對于js中這些比較復(fù)雜的概念的理...
閱讀 1329·2021-11-15 11:37
閱讀 2213·2021-09-23 11:21
閱讀 1299·2019-08-30 15:55
閱讀 2105·2019-08-30 15:55
閱讀 2815·2019-08-30 15:52
閱讀 2818·2019-08-30 11:12
閱讀 1572·2019-08-29 18:45
閱讀 1885·2019-08-29 14:04