通常情況下,請求一個資源的過程大概是這樣的:
我在Ajax中整理了HTTP請求的請求頭和響應(yīng)頭的一些參數(shù),這里就看下Etag的作用。
1、Etag的主要作用
服務(wù)器通過 ETag HTTP 頭傳遞驗證碼,大概是像‘x123cef’這樣的字符串。當瀏覽器在資源過期后再次請求時,瀏覽器默認會通過If-None-Match傳遞Etag的驗證碼,通過驗證碼可以進行高效的資源更新檢查:如果資源未更改,則不會傳輸任何數(shù)據(jù)。
Etag就主要用來在響應(yīng)過期之后,驗證資源是否被修改。
2、Etag的工作原理
如上圖,服務(wù)器在第一次返回響應(yīng)的時候設(shè)置了緩存的時間120s,假設(shè)瀏覽器在這120s經(jīng)過之后再次請求服務(wù)器相同的資源,首先,瀏覽器會檢查本地緩存并找到之前的響應(yīng),不幸的是,這個響應(yīng)現(xiàn)在已經(jīng)’過期’,無法在使用。此時,瀏覽器也可以直接發(fā)出新請求,獲取新的完整響應(yīng),但是這樣做效率較低,因為如果資源未被更改過,我們就沒有理由再去下載與緩存中已有的完全相同的字節(jié)。
于是就到了Etag發(fā)揮作用的時候了,通常服務(wù)器生成并返回在Etag中的驗證碼,常常是文件內(nèi)容的哈希值或者某個其他指紋碼。客戶端不必了解指紋碼是如何生成的,只需要在下一個請求中將其發(fā)送給服務(wù)器(瀏覽器默認會添加):如果指紋碼仍然一致,說明資源未被修改,服務(wù)器會反悔304 Not Modified,這樣我們就可以跳過下載,利用已經(jīng)緩存了的資源,并且該資源會繼續(xù)緩存120s。就像這樣: