http caching

HTTP Caching 用好了,能夠極大的減少服務器負載和減小網絡帶寬。十分有必要深刻了解下 http 的 caching 協議。html

先來看下請求/響應過程:瀏覽器

http 請求/響應

http 請求/響應緩存

一、用 Last-Modified 頭服務器

在第一次請求的響應頭返回 Last-Modified 內容,時間格式如:Wed, 22 Jul 2009 07:08:07 GMT。是零時區的 GMT 時間,servlet 中能夠用 response.addDateHeader("Last-Modified", date.getTime()); 加入響應頭。如圖:網絡

last-modified 和 If-Modified-Since

last-modified 和 If-Modified-Sinceapp

Last-Modified 與 If-Modified-Since 對應的,前者是響應頭,後者是請求頭。服務器要處理 If-Modified-Since 請求頭與Last-Modified 對比看是否有更新,若是沒有更新就返回 304 響應,不然按正常請求處理。若是要在動態內容中使用它們,那就要程序來處理了。工具

ps:servlet 取 If-Modified-Since 能夠用 long last = requst.getDateHeader("If-Modified-Since");spa

二、用 Etag 頭pwa

不少時間可能不能用時間來肯定內容是否有更新。那能夠用 Etag 頭,etag 是之內容計算一個標識。計算的方式能夠本身決定,好比能夠用 crc3二、md5等。orm

Etag 和 If-None-Match

Etag 和 If-None-Match

Etag 與 If-None-Match 是對應的,前者是響應頭,後者是請求頭。服務器要判斷請求內容計算獲得的 etag 是否與請求頭 If-None-Match 是否一致,若是一致就表示沒有更新,返回304就可,不然按正常請求處理。能夠參考:用 HttpServletResponseWrapper 實現 Etag 過濾器

三、用 Expires 頭,過時時間

當請求的內容有 Expires 頭的時候,瀏覽器會在這個時間內不去下載這個請求的內容(這個行爲對 F5 或 Ctrl+F2 無效,用 IE7,Firefox 3.5 試了,有效的好比:在地址輸入後回車)。

expires 過時時間

expires 過時時間

在 servlet 中能夠用 response.addDateHeader("Expires", date.getTime()); 添加過時內容。

ps:在 httpwatch 中能夠看到 Result 爲 (Cached) 狀態的。

四、用 max-age 的 Cache-Control 頭

max-age 的值表示,多少秒後失效,在失效以前,瀏覽器不會去下載請求的內容(固然,這個行爲對 F5 或 Ctrl+F2 無效)。好比:服務器寫 max-age 響應:response.addHeader("Cache-Control", "max-age=10");

ps:若是你還要加一些 Cache-Control 的內容,好比:private,最好不要寫兩個 addHeader,而是一個 response.addHeader("Cache-Control", "private, max-age=10"); 不然 ie 可能對 max-age 無效,緣由它只讀第一個 Cache-Control 頭。

小結:

Last-Modified 與 Etag 頭(便是方式1和2)仍是要請求服務器的,只是僅返回 304  頭,不返回內容。因此瀏覽怎麼 F5 ,304 都是有效的。但用 Ctrl+F5 是全新請求的(這是瀏覽器行爲,不發送緩存相關的頭)。

Expires 頭與 max-age 緩存是不須要請求服務器的,直接從本地緩存中取。但 F5 會忽視緩存(因此使用 httpwatch 之類的 http 協議監察工具時,不要 F5 誤認爲 Expires 和 max-age 是無效的)。

http 協議監察工具:

Firebox:httpfox、live http header

IE:httpwatch、iehttpheader

相關文章
相關標籤/搜索