18

我有一个 Applet,它使用 URLConnection 通过 http 连接加载图像。我正在为所有连接设置 setUseCaches(true),但仍然没有看到任何缓存行为。我的图像的 HTTP 标头具有合理的缓存设置。如果您查看错误 4528599,就会发现这个相当神秘的声明:

Java 插件的当前版本 (1.3.1) 仅检查浏览器缓存中名称以 .jar 或 .class 结尾的文件。有人告诉我,对于 Java Plug-In 1.4,将检查浏览器缓存中的以下文件类型:.class、.jar、.zip、.jpg、.gif、.wav、.au。

当然,这在 1.6 中被标记为 FIXED,但即使在 1.6 下,我也看不到任何缓存。我的图像是 PNG 文件,在某些情况下实际上并没有以 .png 扩展名结尾。我没有看到任何缓存。

错误修复报告谈到了 1.6 统一下载引擎,但 google 似乎对此知之甚少。

这应该有效还是只是另一个损坏的 Sun“功能”。有什么方法或解决方法可以让我的小程序从浏览器缓存中加载 PNG 图像?我宁愿不实现我自己的......

更新:缓存似乎与ResponseCache实现相关联。有关其工作原理的更多信息,请参阅此技术说明。最后一行说:

Java 2 标准版中没有 URLConnection 缓存的默认实现。但是,Java Plugin 和 Java WebStart 确实提供了一个开箱即用的功能。

所以在我看来问题真的变成了:Java Plugin ResponseCache 实现是如何真正工作的?v1.4/v1.5/v.16有什么区别

有人有什么想法吗?

4

2 回答 2

7

此方法很可能仅将传出请求中的 HTTP Cache-Control 标头指令设置为允许缓存的值。如果你调用了 setUseCaches(false),就会有一个

Cache-Control: no-cache

例如指令。要检查这一点,您可以在您的 applet 和服务器之间放置一个 HTTP 调试代理服务器并查看标头。

现在仅仅因为请求表明它愿意使用缓存,您的服务器可能没有设置为启用它们。也许它没有在响应中设置一个适当长的 Expires 标头,或者它在响应中设置了一个禁止缓存的 Cache-Control 标头。

其他一些需要检查的事情:

  • https 响应永远不会被缓存;
  • 您可能在客户端和服务器之间没有 HTTP 缓存;
  • 唯一的 HTTP 缓存是浏览器的缓存,但它可能被禁用或设置为使用很少的磁盘。

如果这只是用于 Web 应用程序测试的普通浏览器,您还需要确保您没有点击刷新按钮,因为这相当于设置无缓存。

于 2009-08-25T21:43:41.920 回答
4

The abstract class URLConnection provides set/getUseCaches methods, which can be used by any subclasses. As far as I've ever been able to determine, however, the HttpURLConnection class doesn't use those fields in any way. Setting the value to true or false won't have any different behavior.

If you want to add http cacheing behavior, you can either do it yourself (write your own, or extend HttpURLConnector; or use Sockets), or try using the If-Modified-Since and If-None-Match headers and look for a status code 304 (Not Modified). The second option is probably the easiest and will get you the best results.

于 2009-08-25T22:57:10.510 回答