2010-01-28 53 views
2

我有一個jsp頁面加載了很多圖像。我想緩存圖像以加快載入速度。啓用緩存指定修改日期的圖像

我會解釋我的想法,請糾正它,如果它是錯誤的。我爲每個圖像調用圖片加載servlet並返回爲BLOB。我的想法是添加修改的日期與圖像和其他值像Last-Modified,過期,緩存控制和最大年齡。從而使瀏覽器明白圖像是否改變。

但我怎樣才能追加一個修改日期到一個BLOB?還是有一些更好的想法,使他們可以緩存?

謝謝...

+0

如何在服務器上生成圖像? – 2010-01-28 15:15:58

+0

目前還不清楚你在問什麼。你問如何將標題添加到HTTP響應?你問如何實現緩存? – 2010-01-28 15:20:34

+0

完全重複:http://stackoverflow.com/questions/2155276/enable-caching-of-images-specifying-a-modified-date @ Coder247:如果你失去了你的問題和/或你想找到所有您的問題,請點擊頂部欄暱稱後面的鏈接以訪問您的個人資料:http://stackoverflow.com/users/236112/coder247 – BalusC 2010-01-28 15:26:04

回答

2

我有一個加載許多圖像的jsp頁面。我想緩存圖像以加快載入速度。

這是一件好事TM

我會解釋我的想法,如果錯誤請糾正。我爲每個圖像調用圖片加載servlet並返回爲BLOB。我的想法是添加修改的日期與圖像和其他值像Last-Modified,過期,緩存控制和最大年齡。從而使瀏覽器明白圖像是否改變。

對於你真正需要的ETagLast-Modified以及可選Expires頭。使用ETag標題,服務器和客戶端都可以識別唯一文件。如有必要,您可以在每個數據庫密鑰下使用它。使用Last-Modified頭標頭,服務器和客戶端都知道它們是否具有相同版本的文件。使用Expires標題,您可以指示客戶端何時在第一個下一個時間重新請求文件(因此,當Expires中指定的日期已過期時)。

Cache-Control標題與此處不太相關,因爲您只需要允許緩存,並且普通客戶端默認已經這樣做。

如需瞭解更多信息和servlet示例,您可能會發現this article有用,也可能是this article,如果您有興趣調整JSP/Servlet Web應用程序的性能。

但是我該如何將修改日期追加到BLOB?還是有一些更好的想法,使他們可以緩存?

只需向表示插入日期的數據庫表添加一列即可。在大多數數據庫中,您只需使用now()函數即可將其作爲自動觸發器進行創建,以便在每次插入/更新時自動設置它。

1

你不想修改HTTP頭,而不是實際的圖像/ BLOB本身?

有關在servlet響應中設置標題的信息,請參閱this page。我懷疑你會看標準的標題,如Expires

1

(從複製的問題移動)

添加一個filt呃(javax.servlet.Filter),只要響應包含圖像就添加緩存標頭。喜歡的東西:

public class StaticResourceCacheFilter implements Filter { 

    public static final String[] CACHEABLE_CONTENT_TYPES = new String[] { 
      "text/css", "text/javascript", "image/png", "image/jpeg", 
      "image/gif", "image/jpg" }; 

    static { 
     Arrays.sort(CACHEABLE_CONTENT_TYPES); 
    } 



    public void init(FilterConfig cfg) throws ServletException { 

    } 

    @Override 
    public void destroy() { 

    } 

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

     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     HttpServletResponse httpResponse = (HttpServletResponse) response; 


     chain.doFilter(httpRequest, httpResponse); 

     String contentType = httpResponse.getContentType(); 

     if (contentType != null && Arrays.binarySearch(CACHEABLE_CONTENT_TYPES, contentType) > -1) { 

      Calendar inTwoMonths = Calendar.getInstance(); 
      inTwoMonths.add(Calendar.MONTH, 2); 

      httpResponse.setHeader("Expires", DateUtil.formatDate(inTwoMonths.getTime())); 
     } else { 
      httpResponse.setHeader("Expires", "-1"); 
     } 

    } 

(其中DateUtilorg.apache.commons.httpclient.util.DateUtil

上述過濾器,當然,假定您已經設置正確的Content-Type爲您的圖像。否則,我認爲它們可能無法在瀏覽器中正確顯示,無論有沒有緩存。

要回答你的問題:

有什麼辦法來保持圖像的緩存中,直到圖像中的服務器得到修改。

這是一個不同的場景。您可以將圖像存儲在一些緩存實現中(例如,ehcache),但這是服務器緩存,而不是客戶端緩存。