Tomcat7服务器配置Cache-Control和Expires
豆豆 2019-12-01 21:06:29 1324人已围观
先看一下YSlow对网页速度评测的结果分析和建议:
从评测结果来看前几个分别是:add Expires headers,Make fewer HTTP reqeusts ,Use CDN,Use cookie-free domains。除了CDN以外其他的几个级别都是通过减少http访问次数,增加缓存方式的建议,这个就需要涉及到HTTP中的Cache-Control和Expires。
HTTP中头中的Cache-Control和Expires
先看看网站的现状:
添加Expires头可以有效减少Http请求次数,只要浏览器中有缓存,并且相应的资源未过期,均可以使用缓存中的资源,无须再发送请求到服务器;
HTTP中 Expires 过期时间响应头信息
Expires:过期时间,是HTTP控制缓存的基本手段,这个属性告诉缓存器:相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修 改。几乎所有的缓存服务器都支持Expires(过期时间)属性;HTTP的日期时间必须是格林威治时 间(GMT),而不是本地时间。举例:Expires: Fri, 30 Oct 1998 14:19:41
虽然过期时间属性非常有用,但是它还是有些局限,首先:是牵扯到了日期,这样Web服务器的时间和缓存服务器的时间必须是同步的,如果有些不同步, 要么是应该缓存的内容提前过期了,要么是过期结果没及时更新。
还有一个过期时间设置的问题也不容忽视:如果你设置的过期时间是一个固定的时间,如果你返回内容的时候又没有连带更新下次过期的时间,那么之后所有 访问请求都会被发送给源Web服务器,反而增加了负载和响应时间;
HTTP中Cache-Control缓存控制响应头信息
Cache-Control(缓存控制)响应头信息,让网站的发布者可以更全面的控制他们的内容,并定位过期时间的限制。
在请求中使用Cache-Control 时,它可选的值有:
在响应中使用Cache-Control 时,它可选的值有:
给静态资源(HTML文件,图片文件等)的Repsone加上Expires/Cache-Control Header是很有效的一招。如果HTTP Response中有Expires这样的Header的话,浏览器会Cache这个资源,理想状况下(注意,只是理想状况),在Expire Date之前,不会再发HTTP请求给Server要这个资源,不过Expires的值只能是一个固定日期,比如“Thu 27 Nov 2008 07:00:00 GMT”,不能是一个类似“从现在开始之后10年”这样一个随机浮动的值,如果要这样的效果,可以用Cache-Control这样的Header,如果 HTTP Response中有这样的Header:“Cache-Control: max-age = 100”,表示这个资源在cache中的最大寿命是100秒。一般说来这种静态文件永远不应该过期,如果真的要给这个Cache加上一个期限,那我希望是 ——一万年,“Cache-Control: max-age = 315360000000”
其实就应该给Expires设一个永远不会过期的时间。
假设你现在有一个文件叫onekbit.js,需要用一个新的js的时候,你不要去覆盖原来的文件,而把新的js存成onekbit_v2.js,让相关网页引用新的onekbit_v2.js,这样可以让新老网页同时工作,实在犯不上为了 节省存储空间覆盖原有文件。
Tomcat7上如何配置这些头信息
Tomcat7关于Expires的配置官方教程如下:
http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Expires_FilterExpiresFilter是Java servlet API 当中的一部分,它负责控制设置response当中的响应头(Expires) 和 ( Cache-Control的max-age),过期时间可以设置为相对于源文件的最后修改时间,或者浏览器的访问时间。这些响应头指示浏览器控制文档的缓存,如果使用了缓存,那么浏览器在下一次获取文档(HTML)的时候就会从本地缓存中获取,而不是访问实际的资源服务器,除非超过失效时间。
1、官方配置详情:
tomcat容器提供自有的过滤器来设置HTTP缓存,只需在:Tomcat安装目录/config/web.xml中进行配置即可:
<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 10 days</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType text/css</param-name>
<param-value>access plus 10 days</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType application/javascript</param-name>
<param-value>access plus 10 days</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType application/x-unknown-content-type</param-name>
<param-value>access plus 10 years</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType image/x-icon</param-name>
<param-value>access plus 10 days</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType image/gif</param-name>
<param-value>access plus 10 days</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FOWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
配置语法介绍:
<init-param>
<param-name>ExpiresByType type</param-name>
<param-value><base> [plus] {<num> <type>}*</param-value>
</init-param>还有一种配置:
<init-param> <param-name>ExpiresDefault</param-name> <param-value>access plus 1 month</param-value>////缓存到期时间设置为当前时间 加上 1个月 </init-param>ExpiresDefault代表所有的MIME类型 比如 text/plain image/png application/javascript等等。
param-name 中主要就是:
MIME类型 比如 text/plain image/png application/javascript等等。
param-value中的参数base可以设置为:
access 访问时间。
now (equivalent to 'access') 当前时间,相当于访问时间。
modification 文件的最后修改时间。
plus:值是可选的,可以不填,没什么意义。
num:必须是一个integer。
type可以设置为:
years
months
weeks
days
hours
minutes
seconds 详细的可以参考tomcat官方英文文档
2、7.0.61以上的引入catalina.jar包及相关的依赖包在j2ee项目中的web-Inf/web.xml文件中配置:
jar包详情:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>7.0.61</version>
</dependency>
自己工程项目web.xml文件中配置内容如下:
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType text/html</param-name>
<param-value>access plus 1 minutes</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType image</param-name>
<param-value>access plus 10 years</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType text/css</param-name>
<param-value>access plus 10 months</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType application/javascript</param-name>
<param-value>access plus 10 months</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType application/x-unknown-content-type</param-name>
<param-value>access plus 10 years</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
配置中的语法同方法1中相同
3、如果配置不起作用需要检查的点:
<meta http-equiv="Expires" CONTENT="0"> //这一句设置文件的过期时间为0秒
<meta http-equiv="Cache-Control" CONTENT="no-cache"> //这一句设置文件禁止被缓存
4、自己代码实现ExpiresFilter的方式:
下次再写