Java項目—— HTTP緩存

一、服務器控制緩存的能力

當客戶端第一次請求服務器端的資源時,服務器端可以通過如下幾種方式控制資源的緩存能力。
Cache-Control: no-store,禁止緩存對響應進行復制。
Cache-Control: no-cache,以前老認爲這個是不緩存的意思,下面從《HTTP權威指南》摘錄一段解釋:標識爲 no-cache 的響應實際上是可以存儲在本地緩存區中的。 只是在與原始服務器進行新鮮度再驗證之前,緩存不能將其提供給客戶端使用。
這個首部使用 donot-serve-from-cache-without-revalidation 這個名字會更恰當一些。
Cache-Control: must-revalidate,在事先沒有跟原始服務器進行再驗證的情況下,不能提供這個對象的陳舊副本。 緩存仍然可以隨意提供新鮮的副本。如果在緩存進行 must-revalidate 新鮮度檢查時,原始服務器不可用,緩存就必須返回一條 504 Gateway Timeout 錯誤。
Cache-Control: max-age=3600,從服務器將文檔傳來之時起, 可以認爲此文檔處於新鮮狀態的秒數。
Expires: Fri, 05 Jul 2002, 05:00:00 GMT,實際的過期日期,不推薦使用。
不附加過期信息,讓緩存確定自己的過期日期,如果響應中沒有 Cache-Control: max-age 首部, 也沒有 Expires 首部, 緩存可以計算出一個試探性最大使用期。 可以使用任意算法, 但如果得到的最大使用期大於 24 小時, 就應該向響應首部添加一個 Heuristic Expiration Warning( 試探性過期警告, 警告 13) 首部。LM-Factor 算法是一種很常用的試探性過期算法。

即通過在 response 響應頭header 增加 Cache-Control 屬性及指定的值就可以實現服務器控制緩存
(note: 該方式客戶端還是會發請求到服務器端)

二、、強緩存

瀏覽器強緩存 就是說當請求一個資源時,直接從本地的瀏覽器緩存中讀取,不發起HTTP請求

在這裏插入圖片描述
像這種顯示from cache的就是直接讀取的瀏覽器本地緩存.
HTTP 控制直接讀取本地緩存有如下兩種方式:

名稱 說明
Expires 響應失效的日期和時間。類似於:Expires:Sat, 20 Aug 2016 01:40:57 GMT,絕對值,告訴客戶端在這個時間點之後資源過期,需要重新從服務器取。
Cache-Control 類似於:Cache-Control:max-age=315360000,相對值,在多久後過期

通過上面兩種方式,當資源的緩存還在有效期時,瀏覽器直接從本地緩存中取資源,而不是發起HTTP請求從源服務器取。由於客戶端與服務器端存在時間差,Expires並不是那麼的靠譜,所以建議使用 max-age

三、tomcat 設置 http 緩存

tomcat 配置http緩存官方文檔

   <!-- 在tomcat 目錄下/conf/web.xml 中增加如下代碼就能對image 類型的http請求緩存 一個月有效 -->
   <filter>
   	<filter-name>ExpiresFilter</filter-name>
   	<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
   	<init-param>
   		<param-name>ExpiresByType image</param-name>
   		<param-value>access plus 1 month</param-value>
   	</init-param>
   </filter>
   <filter-mapping>
   	<filter-name>ExpiresFilter</filter-name>
   	<url-pattern>/*</url-pattern>
   	<dispatcher>REQUEST</dispatcher>
   </filter-mapping>

參考自原文:http://muchstudy.com/2016/08/18/HTTP緩存詳解/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章