让tomcat使用强制ETag参数解除浏览器对静态文件的缓存
程序员文章站
2024-02-28 19:29:34
...
Etag在HTTP1.1中有介绍,主要的作用就是在(css file, image, javascript file)文件
请求返回的http头加入ETag参数,Etag有服务器端生成,并且随着文件的改变而改变,这样浏览器端就会只重新请求获取 Etag发生变化的文件,减少浏览器端数据的流量,加快浏览器的反应速度,重要的是减轻服务器端的压力,所以服务器端Etag的实现就比较重要了。
ETag有两种,一种是弱类型的(Weak ETag),一种是强类型的(Strong ETag),强类型格式为ETag="文件长-最后修改时间",弱类型是在前面加上W/如:W/"文件长-最后修改时间",在浏览器中监控如下:
1.第一次请求一个静态文件返回:
HTTP/1.1 200 Ok
ETag: W/"1837-1431071955000"
2.第二次请求:
If-None-Match: W/"1837-1431071955000"
If-Modified-Since: Fri, 08 May 2015 07:59:15 GMT
返回:
HTTP/1.1 304 Not Modified
ETag: W/"1837-1431071955000"
Date: Fri, 28 Oct 2016 02:47:04 GMT
默认情况下使用弱类型的ETag浏览器会忽略设个机制,而且tomcat默认就是使用的这种机制,所以当你更新一个静态文件比如脚本啊或者一个样式文件,发现浏览器里面还是原来的文件,必须清理缓存或者在文件后面加上一个参数才能自动更新浏览器的缓存,而且tomcat也没有可配置的地方能够配置tomcat使用请类型的ETag,下面提供一个方法来修改这个机制,就是继承类org.apache.naming.resources.FileDirContext,重写doGetAttributes,在返回的属性中加入强类型ETag就可以了,代码如下:
package cn.fullstacks.tomcat;
import java.io.File;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
/**
* 在http返回头中返回强类型ETag代替tomcat的弱类型ETag
* 在context.xml中配置
*