2009-08-25 15 views
18

我有一個Applet,它使用URLConnection通過http連接加載圖像。我爲所有連接設置了setUseCaches(true),但仍然沒有看到任何緩存行爲。我的圖片的HTTP標頭具有合理的緩存設置。如果你看一下bug 4528599有這個頗具神祕色彩的語句:URLConnection.setUseCaches()如何在實踐中工作?

的Java插件的最新版本(1.3.1)只檢查 文件後綴名爲的.jar或的.class瀏覽器緩存。我被告知,對於Java Plug-In 1.4瀏覽器緩存將檢查以下文件 類型:.class,.jar,.zip,.jpg,.gif,.wav,.au。

當然,這被標記爲固定爲1.6,但即使在1.6下,我也沒有看到任何緩存。我的圖像是PNG文件,並且在某些情況下實際上並不以.png擴展名結尾。我沒有看到任何緩存。

錯誤修復報告中提到了1.6統一下載引擎,但谷歌似乎對此知之甚少。

這是應該工作還是隻是另一個破碎的太陽「功能」。有什麼方法或解決辦法可以讓我的小程序從瀏覽器緩存中加載PNG圖像?我不想實現我自己的....

更新:緩存似乎與ResponseCache實施綁定。有關如何工作的更多信息,請參閱this technote。最後一行說:

在Java 2標準版 中沒有URLConnection緩存的默認實現。但是,Java Plugin和Java WebStart 提供了一個開箱即用的功能。

所以在我看來,問題真的變成了:Java插件ResponseCache實現如何真正起作用? v1.4/v1.5/v.16之間有什麼區別

任何人有任何想法?

回答

7

此方法很可能只是將傳出請求中的HTTP Cache-Control標頭指令設置爲允許緩存的值。如果您打電話給setUseCaches(false),將會有一個指令,例如

Cache-Control: no-cache 

指令。爲了檢查這一點,你可以在你的applet和服務器之間放置一個HTTP調試代理服務器,並查看標題。

現在只是因爲請求表示願意使用緩存,您的服務器可能未設置爲啓用它們。也許它不會在響應中設置一個適當長的Expires頭,或者它可能會在禁止緩存的響應中設置Cache-Control頭。

其他有些事情要檢查:

  • HTTPS響應不會被緩存;
  • 您可能沒有客戶端和服務器之間的HTTP緩存;
  • 唯一的HTTP緩存是瀏覽器的緩存,但它可能被禁用或設置爲使用非常小的磁盤。

如果這只是一個瀏覽器到web應用程序測試的香草瀏覽器,你還要確保你沒有點擊刷新按鈕,因爲這相當於設置no-cache。

4

抽象類URLConnection提供set/getUseCaches方法,其中可以被任何子類使用。據我所知,然而,HttpURLConnection類不以任何方式使用這些字段。將該值設置爲true或false不會有任何不同的行爲。你可以自己做(自己寫,或者擴展HttpURLConnector;或者使用套接字),或者嘗試使用If-Modified-SinceIf-None-Match標題並查找狀態代碼304(不是)改性)。第二種選擇可能是最簡單的,並且會給你帶來最好的結果。

+0

當緩存持久存在時,編寫自己的代碼並不重要。您需要讓多個JVM同時運行,並且您需要將其限制在一個大小內。它真的應該只是工作.... arrgh ... – 2009-08-26 01:08:36

+0

我肯定會推薦不滾動自己的緩存。如果客戶端和服務器正在發送正確的HTTP標頭,但客戶端和服務器之間沒有建立中間HTTP緩存,請安裝代理緩存,如Varnish,Pound或Squid。 – 2009-08-26 04:45:08