我有一個jsp頁面加載了很多圖像。我想緩存圖像以加快載入速度。啓用緩存指定修改日期的圖像
我會解釋我的想法,請糾正它,如果它是錯誤的。我爲每個圖像調用圖片加載servlet並返回爲BLOB。我的想法是添加修改的日期與圖像和其他值像Last-Modified,過期,緩存控制和最大年齡。從而使瀏覽器明白圖像是否改變。
但我怎樣才能追加一個修改日期到一個BLOB?還是有一些更好的想法,使他們可以緩存?
謝謝...
我有一個jsp頁面加載了很多圖像。我想緩存圖像以加快載入速度。啓用緩存指定修改日期的圖像
我會解釋我的想法,請糾正它,如果它是錯誤的。我爲每個圖像調用圖片加載servlet並返回爲BLOB。我的想法是添加修改的日期與圖像和其他值像Last-Modified,過期,緩存控制和最大年齡。從而使瀏覽器明白圖像是否改變。
但我怎樣才能追加一個修改日期到一個BLOB?還是有一些更好的想法,使他們可以緩存?
謝謝...
我有一個加載許多圖像的jsp頁面。我想緩存圖像以加快載入速度。
這是一件好事TM。
我會解釋我的想法,如果錯誤請糾正。我爲每個圖像調用圖片加載servlet並返回爲BLOB。我的想法是添加修改的日期與圖像和其他值像Last-Modified,過期,緩存控制和最大年齡。從而使瀏覽器明白圖像是否改變。
對於你真正需要的ETag
,Last-Modified
以及可選Expires
頭。使用ETag
標題,服務器和客戶端都可以識別唯一文件。如有必要,您可以在每個數據庫密鑰下使用它。使用Last-Modified
頭標頭,服務器和客戶端都知道它們是否具有相同版本的文件。使用Expires
標題,您可以指示客戶端何時在第一個下一個時間重新請求文件(因此,當Expires
中指定的日期已過期時)。
Cache-Control
標題與此處不太相關,因爲您只需要允許緩存,並且普通客戶端默認已經這樣做。
如需瞭解更多信息和servlet示例,您可能會發現this article有用,也可能是this article,如果您有興趣調整JSP/Servlet Web應用程序的性能。
但是我該如何將修改日期追加到BLOB?還是有一些更好的想法,使他們可以緩存?
只需向表示插入日期的數據庫表添加一列即可。在大多數數據庫中,您只需使用now()
函數即可將其作爲自動觸發器進行創建,以便在每次插入/更新時自動設置它。
你不想修改HTTP頭,而不是實際的圖像/ BLOB本身?
有關在servlet響應中設置標題的信息,請參閱this page。我懷疑你會看標準的標題,如Expires
。
我相信你應該爲受控緩存設置合適的頭文件。
您始終可以使用http協議規範作爲發送和設置相應標頭(響應標頭)的參考。
你可以看看下面的鏈接:
緩存在HTTP http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
HTTP協議報頭字段定義 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
問候,
(從複製的問題移動)
添加一個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");
}
}
(其中DateUtil
爲org.apache.commons.httpclient.util.DateUtil
)
上述過濾器,當然,假定您已經設置正確的Content-Type
爲您的圖像。否則,我認爲它們可能無法在瀏覽器中正確顯示,無論有沒有緩存。
要回答你的問題:
有什麼辦法來保持圖像的緩存中,直到圖像中的服務器得到修改。
這是一個不同的場景。您可以將圖像存儲在一些緩存實現中(例如,ehcache),但這是服務器緩存,而不是客戶端緩存。
如何在服務器上生成圖像? – 2010-01-28 15:15:58
目前還不清楚你在問什麼。你問如何將標題添加到HTTP響應?你問如何實現緩存? – 2010-01-28 15:20:34
完全重複: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