您现在的位置是:首页 >  云笔记 >  开发笔记 >  文章详情

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_Filter

         ExpiresFilter是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、如果配置不起作用需要检查的点:

    3.1、html页面是否有禁止缓存的meta;
<meta  http-equiv="Expires"  CONTENT="0">  //这一句设置文件的过期时间为0秒
<meta  http-equiv="Cache-Control"  CONTENT="no-cache">  //这一句设置文件禁止被缓存
    3.2、实现代码中是否有限定的header头信息;
    3.3、配置过程中发现在tomcat-7.0.56中有效在7.0.61版本中很多类型文件无效;

4、自己代码实现ExpiresFilter的方式:

      下次再写











分享到:

编辑发布时间:2019-12-01 21:06:29