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