2011-03-10 88 views
4

我想要将我的网页中的.png文件缓存起来。我加在web.xmlresponse.setDateHeader() - 缓存不起作用

<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> 

以下方式在初始化设置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

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

response.setDateHeader移到filChain.doFilter之前,并且应发送标题。

话虽如此,这东西是非常棘手的,以得到正确的。浏览器对HTTP缓存有各种不同的行为,发送你认为正确的头文件并不总是有你想要的效果。

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

+0

我移动了上面的doFilter()的response.setDateHeader并安装了Live HTTP头插件。我可以看到png文件的返回期限设置为web.xml中配置的值。但是,当我刷新,仍然客户端正在请求这些文件? 是否有任何标准方法来强制执行此缓存而不是expires选项? – ihavprobs

+0

@shk:您需要为此使用适当的Web框架,而不是试图用原始的Servlet API自己解决它。 – skaffman

+0

谢谢。我会检查。 – ihavprobs

2

'过期日期'日期不得超过一年。 见14.21节在http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

到期标记一个响应为“永不过期”, 原始服务器发送一个到期日期 大约一年从发送响应时间 。 HTTP/1.1服务器 不应该发送过期日期更多 未来一年。

+0

我改为不到一年。尽管如此,我仍然可以在日志中看到这个过滤器类的请求。 – ihavprobs