4

我希望缓存网页中的 .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 文件。猜猜我的过滤器不工作。这个配置正确吗?

4

2 回答 2

2

查看您的代码,一个可能的罪魁祸首是您在servlet 处理了请求之后设置了响应标头。此时添加标头为时已晚,响应数据已经发送。

response.setDateHeaderto 移到 之前filChain.doFilter,并且应该发送标头。

话虽如此,这些东西是出了名的棘手。浏览器对 HTTP 缓存有各种不同的行为,并且发送您认为正确的标头并不总是具有您正在寻找的效果。

尝试使用 HTTP 标头嗅探工具(例如出色的 firefox 的“ Live HTTP Headers ”插件)来查看实际来回发生的情况。

于 2011-03-10T10:27:24.860 回答
2

“到期”日期不应超过未来一年。请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html中的第 14.21 节过期

要将响应标记为“永不过期”,源服务器会在响应发送后大约一年发送 Expires 日期。HTTP/1.1 服务器不应该在未来一年以上发送 Expires 日期。

于 2011-03-10T10:28:14.280 回答