caching協(xié)議應(yīng)用圖示解析
在HTTP協(xié)議中,包括一種協(xié)議caching協(xié)議。那么對(duì)于這個(gè)協(xié)議的使用很多朋友都是不太清楚的。那么我們現(xiàn)在就針對(duì)這個(gè)協(xié)議的一些應(yīng)用來為大家進(jìn)行一下介紹。HTTP中caching協(xié)議用好了,可以極大的減小服務(wù)器負(fù)載和減少網(wǎng)絡(luò)帶寬。十分有必要深入了解下HTTP的caching協(xié)議。
先來看下HTTP的caching協(xié)議請(qǐng)求/響應(yīng)過程:
HTTP請(qǐng)求/響應(yīng)
用Last-Modified 頭
在***次請(qǐng)求的響應(yīng)頭返回 Last-Modified 內(nèi)容,時(shí)間格式如:Wed, 22 Jul 2009 07:08:07 GMT。是零時(shí)區(qū)的 GMT 時(shí)間,servlet 中可以用 response.addDateHeader("Last-Modified", date.getTime()); 加入響應(yīng)頭。如圖:
last-modified 和 If-Modified-Since
Last-Modified 與 If-Modified-Since 對(duì)應(yīng)的,前者是響應(yīng)頭,后者是請(qǐng)求頭。服務(wù)器要處理 If-Modified-Since 請(qǐng)求頭與Last-Modified 對(duì)比看是否有更新,如果沒有更新就返回 304 響應(yīng),否則按正常請(qǐng)求處理。如果要在動(dòng)態(tài)內(nèi)容中使用它們,那就要程序來處理了。
ps:servlet 取 If-Modified-Since 可以用 long last = requst.getDateHeader("If-Modified-Since");#p#
HTTP的caching協(xié)議用Etag頭
很多時(shí)間可能不能用時(shí)間來確定內(nèi)容是否有更新。那可以用Etag頭,etag 是以內(nèi)容計(jì)算一個(gè)標(biāo)識(shí)。計(jì)算的方式可以自己決定,比如可以用 crc32、md5等。
Etag和If-None-Match
Etag與If-None-Match是對(duì)應(yīng)的,前者是響應(yīng)頭,后者是請(qǐng)求頭。服務(wù)器要判斷請(qǐng)求內(nèi)容計(jì)算得到的Etag是否與請(qǐng)求頭 If-None-Match 是否一致,如果一致就表示沒有更新,返回304就可,否則按正常請(qǐng)求處理。可以參考:用 HTTPServletResponseWrapper 實(shí)現(xiàn)Etag過濾器。#p#
HTTP的caching協(xié)議用Expires頭,過期時(shí)間
當(dāng)請(qǐng)求的內(nèi)容有 Expires 頭的時(shí)候,瀏覽器會(huì)在這個(gè)時(shí)間內(nèi)不去下載這個(gè)請(qǐng)求的內(nèi)容(這個(gè)行為對(duì) F5 或 Ctrl+F2 無效,用 IE7,Firefox 3.5 試了,有效的比如:在地址輸入后回車)。
expires過期時(shí)間
在 servlet 中可以用 response.addDateHeader("Expires", date.getTime()); 添加過期內(nèi)容。
ps:在HTTPwatch中可以看到 Result 為 (Cached) 狀態(tài)的。
HTTP的caching協(xié)議用 max-age 的 Cache-Control 頭
max-age 的值表示,多少秒后失效,在失效之前,瀏覽器不會(huì)去下載請(qǐng)求的內(nèi)容(當(dāng)然,這個(gè)行為對(duì) F5 或 Ctrl+F2 無效)。比如:服務(wù)器寫 max-age 響應(yīng):response.addHeader("Cache-Control", "max-age=10");
ps:如果你還要加一些 Cache-Control 的內(nèi)容,比如:private,***不要寫兩個(gè) addHeader,而是一個(gè) response.addHeader("Cache-Control", "private, max-age=10"); 否則 ie 可能對(duì) max-age 無效,原因它只讀***個(gè) Cache-Control 頭。
HTTP的caching協(xié)議小結(jié):
Last-Modified 與Etag頭(即是方式1和2)還是要請(qǐng)求服務(wù)器的,只是僅返回 304頭,不返回內(nèi)容。所以瀏覽怎么 F5 ,304 都是有效的。但用 Ctrl+F5 是全新請(qǐng)求的(這是瀏覽器行為,不發(fā)送緩存相關(guān)的頭)。
Expires 頭與 max-age 緩存是不需要請(qǐng)求服務(wù)器的,直接從本地緩存中取。但 F5 會(huì)忽視緩存(所以使用 HTTPwatch 之類的HTTP協(xié)議監(jiān)察工具時(shí),不要 F5 誤認(rèn)為 Expires 和 max-age 是無效的)。