2010-05-20 52 views
8

我正在從我的servlet提供圖像。響應內容類型是image/jpeg。我發現從我的servlet請求的圖像沒有被緩存。我如何讓它們像文件映像請求一樣被緩存?我試着設置Cache-Control:public但無濟於事。由servlet提供的緩存圖像

回答

-8

好吧..看起來像默認標題字段應啓用緩存。我在另一個論壇找到了解決方案。顯然,您需要在響應中明確設置內容長度。不知道爲什麼。我認爲HttpServletResponse會爲我們做到這一點。無論如何,它像一個魅力,圖像緩存得很好。

+4

也許你可以提供一個鏈接到你找到答案的論壇? – Stewart 2012-06-13 22:53:41

2

例如,如果你希望緩存他們1個月:

Calendar inOneMonth = Calendar.getInstance(); 
inOneMonth.add(Calendar.MONTH, 1); 

response.setDateHeader("Expires", inOneMonth.getTimeInMillis()); 

(這是一個Filter處理該*.jpg模式,例如)

不過,形象應該是默認緩存 - 檢查你的過濾器和配置,看看有沒有不正確地設置緩存參數。

3

您需要沿響應發送ETagLast-ModifiedExpires標頭。 ETag表示文件的唯一標識符(通常基於文件名,文件大小和上次修改時間戳的組合)。 Last-Modified代表文件的最後修改時間戳。 Expires標頭表示允許客戶端將文件保存在緩存中的時間。如果緩存已過期,並且ETagLast-Modified可用,則客戶端將發送HEAD請求以檢查文件是否需要更新。如果不是,那麼Expires將相應地再推遲。

你可以在這裏找到它處理這一切(和下載簡歷和自動GZIP)一個servlet實例:FileServlet supporting resume and GZIP

22

服務於集裝箱靜態內容,如Tomcat沒有設置任何緩存控制頭默認的servlet。你不需要爲此寫一個servlet。只要創建每當你想添加緩存控制這樣的過濾器,

public void doFilter(ServletRequest request, 
     ServletResponse response, 
     FilterChain chain) 
    throws IOException, ServletException { 

    long expiry = new Date().getTime() + cacheAge*1000; 

    HttpServletResponse httpResponse = (HttpServletResponse)response; 
    httpResponse.setDateHeader("Expires", expiry); 
    httpResponse.setHeader("Cache-Control", "max-age="+ cacheAge); 

    chain.doFilter(request, response); 

} 

,只需將過濾器添加到資源在web.xml中。例如,

<filter> 
    <filter-name>CacheControl</filter-name> 
    <filter-class>filters.CacheControlFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>CacheControl</filter-name> 
    <url-pattern>/images/*</url-pattern> 
</filter-mapping> 
+2

標題以毫秒爲單位,所以'cacheAge'是你想要緩存的東西的秒數。 – 2012-10-31 13:08:36

+2

這個過濾器可以用於css和javascript文件嗎? – Shadow 2014-04-17 08:43:09