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缓存详解/

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