我希望我的网页中的.png文件被缓存。我在web.xml中添加了以下条目
<filter>
<filter-name>ContentFilter</filter-name>
<filter-class>filters.ContentFilter</filter-class>
<init-param>
<description>Add an Expires Header</description>
<param-name>expiryDate</param-name>
<param-value>Fri, 30 Apr 2021 20:00:00 GMT</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ContentFilter</filter-name>
<url-pattern>*.png</url-pattern>
</filter-mapping>
在init()
中按以下方式设置expiryDate字段值String expiryDateStr = filterConfig.getInitParameter("expiryDate");
SimpleDateFormat format = new SimpleDateFormat(
"EEE, d MMM yyyy HH:mm:ss Z");
try {
Date d = format.parse(expiryDateStr);
expiryDate = d.getTime();
} catch (ParseException e) {
logger.error(e.getMessage(), e);
}
doFilter()是:
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain filChain) throws IOException, ServletException {
logger.debug("doFilter()");
logger.info(((HttpServletRequest)req).getRequestURL().toString());
filChain.doFilter(req, res);
if (res instanceof HttpServletResponse) {
HttpServletResponse response = (HttpServletResponse) res;
logger.info(((HttpServletRequest)req).getRequestURL().toString());
response.setDateHeader("Expires", expiryDate);
}
}
我的问题是,每当我在浏览器中刷新网页时,客户端都会不断请求.png文件。猜猜我的过滤器无法正常工作。这种配置是否正确?
答案 0 :(得分:2)
查看您的代码,可能的罪魁祸首是您在servlet处理了请求之后设置了响应头。此时添加标题为时已晚,响应数据已经发送。
将response.setDateHeader
移至filChain.doFilter
之前,并应发送标题。
话虽如此,这个东西对于正确而言是出了名的狡猾。浏览器具有HTTP缓存的各种不同行为,并且发送您认为正确的标题并不总是具有您正在寻找的效果。
尝试使用HTTP标头嗅探工具(如firefox的优秀“Live HTTP Headers”插件)来查看实际来回的内容。
答案 1 :(得分:2)
'过期'日期不应超过一年。 请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
中的第14.21节“过期”将回复标记为“永不过期” 原始服务器发送过期日期 距离大约一年 响应已发送。 HTTP / 1.1服务器 不应该再发送过期日期 未来一年。