強(qiáng)緩存與協(xié)商緩存的區(qū)別
強(qiáng)緩存:瀏覽器不與服務(wù)端協(xié)商直接取瀏覽器緩存
協(xié)商緩存:瀏覽器會(huì)先向服務(wù)器確認(rèn)資源的有效性后才決定是從緩存中取資源還是重新獲取資源
協(xié)商緩存運(yùn)作原理
現(xiàn)在有一個(gè)這樣的業(yè)務(wù)情景:后端的靜態(tài)資源會(huì)不定時(shí)地發(fā)生更新,而因?yàn)闉g覽器默認(rèn)使用強(qiáng)緩存,會(huì)默認(rèn)從瀏覽器緩存中取到過(guò)時(shí)的資源。
現(xiàn)在我們希望瀏覽器每次獲取資源的時(shí)候都向后端確認(rèn)資源是否更新,就要設(shè)置瀏覽器使用協(xié)商緩存
那么后端如何判斷資源是否更新了呢?這時(shí)就要用到Etag和Last-Modified兩項(xiàng)響應(yīng)頭。
每次收到一個(gè)靜態(tài)資源的請(qǐng)求時(shí),后端都將資源的最后修改時(shí)間(Last-Modified)、根據(jù)資源內(nèi)容計(jì)算出來(lái)的Etag放在響應(yīng)頭給前端。
前端收到響應(yīng)后將這兩項(xiàng)緩存起來(lái),然后在下次請(qǐng)求同樣資源的時(shí)候,將這兩項(xiàng)的內(nèi)容放到If-Modified-Since和If-None-Match這兩項(xiàng)請(qǐng)求頭中。
服務(wù)端收到這兩項(xiàng)后,會(huì)與資源當(dāng)前生成的Etag和Last-Modified做比較,如果兩者都一致,說(shuō)明資源沒(méi)有更新,服務(wù)端會(huì)返回304空響應(yīng);否則,說(shuō)明資源有更新,服務(wù)端會(huì)將完整的資源內(nèi)容返回
HTTP協(xié)議的Cache -Control指定請(qǐng)求和響應(yīng)遵循的緩存機(jī)制。在請(qǐng)求消息或響應(yīng)消息中設(shè)置 Cache-Control并不會(huì)影響另一個(gè)消息處理過(guò)程中的緩存處理過(guò)程。
請(qǐng)求時(shí)的緩存指令包括: no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached等。
響應(yīng)消息中的指令包括: public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。
參考文章: