java – response.setDateHeader() – 缓存无法正常工作

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

最佳答案
查看您的代码,可能的罪魁祸首是您在servlet处理请求后设置响应头.在该点添加标题为时已晚,响应数据已经发送.

将response.setDateHeader移到filChain.doFilter之前,并应发送标头.

话虽如此,这个东西对于正确的做法是非常棘手的.浏览器具有HTTP缓存的各种不同行为,并且发送您认为正确的标题并不总是具有您正在寻找的效果.

尝试使用HTTP标头嗅探工具(如firefox的优秀“Live HTTP Headers”插件)来查看实际来回的内容.

转载注明原文:java – response.setDateHeader() – 缓存无法正常工作 - 代码日志