Tomcat性能调优 通过ExpiresFilter设置资源缓存
官方文档
http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Expires_Filter
简介
ExpiresFilter是Java servlet API 当中的一部分,它负责控制设置response当中的响应头:Expires 和 Cache-Control的max-age,过期时间可以设置为相对于源文件的最后修改时间,或者浏览器的访问时间。
这些响应头指示浏览器控制资源的缓存,如果使用了缓存,那么浏览器在下一次获取资源的时候就会从本地缓存中获取,而不是访问实际的资源服务器,除非超过失效时间。
配置路径
tomcat的conf目录下的web.xml文件
例子
下面的例子针对所有的HTML IMAGE CSS JAVASCRIPT 输出进行控制,添加HTTP头设置客户端缓存。
<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 5 minutes</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType image</param-name>
<param-value>access plus 5 minutes</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType text/css</param-name>
<param-value>access plus 5 minutes</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType application/javascript</param-name>
<param-value>access plus 5 minutes</param-value>
</init-param>
</filter>
...
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
语法介绍
<init-param>
<param-name>ExpiresDefault</param-name>
<param-value><base> plus <num> <type></param-value>
</init-param>
<init-param>
<param-name>ExpiresByType type</param-name>
<param-value><base> plus <num> <type></param-value>
</init-param>
<init-param>
<param-name>ExpiresByType type;encoding</param-name>
<param-value><base> plus <num> <type></param-value>
</init-param>
base可以设置为:
- access 访问时间。
- now (equivalent to ‘access’) 当前时间,相当于访问时间。
- modification 文件的最后修改时间。
num必须是一个integer。
type的值可以设置为:
- years
- months
- weeks
- days
- hours
- minutes
- seconds
ExpiresDefault代表所有的MIME类型 比如 text/plain image/png application/javascript等等。
下面的例子设置所有的MIME类型的输出被客户端缓存一个月,即缓存过期时间为一个月。
<init-param>
<param-name>ExpiresDefault</param-name>
<param-value>access plus 1 month</param-value>
</init-param>
<init-param>
<param-name>ExpiresDefault</param-name>
<param-value>access plus 4 weeks</param-value>
</init-param>
<init-param>
<param-name>ExpiresDefault</param-name>
<param-value>access plus 30 days</param-value>
</init-param>
过期时间还可以使用子句进行调整,例如:
<init-param>
<param-name>ExpiresByType text/html</param-name>
<param-value>access plus 1 month 15 days 2 hours</param-value>
// 缓存到期时间设置为当前时间 加上 1个月 15天 2小时
</init-param>
<init-param>
<param-name>ExpiresByType image/gif</param-name>
<param-value>modification plus 5 hours 3 minutes</param-value>
// 缓存到期时间设置为文件的修改时间 加上 5小时 3分钟
</init-param>
什么样的情况response会被设置缓存头
1、根据ExpiresByType 指定的 Content-Type 或者 使用了ExpiresDefault
2、Expires或Cache-Control 这俩个响应头没有被定义情况过滤器才会设置,如果我们已经设置了该响应头,那么就不会再重复设置了。
3、response的status没有包含在ExpiresExcludedResponseStatusCodes这个属性的配置当中。
这个属性可以在web.xml当中配置过滤器当中配置,定义哪些状态吗不需要设置缓存头,默认304的时候就不会被设置。