response.setDateHeader() - 缓存不起作用

时间:2011-03-10 10:23:20

标签: java servlets http-caching

我希望我的网页中的.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文件。猜猜我的过滤器无法正常工作。这种配置是否正确?

2 个答案:

答案 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服务器   不应该再发送过期日期   未来一年。