2011-03-10 87 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