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