我有一个Applet,它使用URLConnection通过http连接加载图像。我为所有连接设置setUseCaches(true),但仍然没有看到任何缓存行为。我的图像的HTTP标头具有合理的缓存设置。如果你看bug 4528599,就有这个相当神秘的陈述:
Java Plug-In的当前版本(1.3.1)仅检查浏览器缓存 名称以.jar或.class结尾的文件。我被告知Java插件 1.4将检查浏览器缓存以查找以下文件 类型:.class,.jar,.zip,.jpg,.gif,.wav,.au。
当然,这被标记为1.6的固定,但即使在1.6以下,我也看不到任何缓存。我的图像是PNG文件,在某些情况下,实际上并不以.png扩展名结尾。我没有看到任何缓存。
错误修复报告讨论了1.6统一下载引擎,但谷歌似乎并不了解它。
这应该是有效还是只是另一个破碎的太阳“功能”。有什么方法或解决方法,我可以让我的applet从浏览器缓存加载PNG图像?我宁愿不实施自己的......
更新:缓存似乎与ResponseCache实施相关联。有关其工作原理的详细信息,请参阅this technote。最后一行说:
在中没有URLConnection缓存的默认实现 Java 2标准版。但是,Java插件和Java WebStart都可以 提供一个开箱即用的。
所以在我看来问题确实变成了:Java插件ResponseCache实现如何真正起作用? v1.4 / v1.5 / v.16
之间有什么区别有人有任何想法吗?
答案 0 :(得分:7)
此方法很可能只将传出请求中的HTTP Cache-Control头指令设置为允许缓存的值。如果你调用了setUseCaches(false),就会有一个
Cache-Control: no-cache
例如指令。要检查这一点,您可以在applet和服务器之间放置一个HTTP调试代理服务器,并查看标题。
现在只是因为请求说它愿意使用缓存,您的服务器可能没有设置为启用它们。也许它没有在响应中设置具有适当长时间的Expires头,或者可能是在禁止缓存的响应中设置Cache-Control头。
要检查的其他一些事项:
如果这只是一个针对Web应用程序测试的普通浏览器,您还需要确保没有按下刷新按钮,因为这相当于设置no-cache。
答案 1 :(得分:4)
抽象类URLConnection提供了set / getUseCaches方法,任何子类都可以使用 。然而,就我所能确定的而言,HttpURLConnection类不以任何方式使用这些字段。将值设置为true或false将不会有任何不同的行为。
如果你想添加http缓存行为,你可以自己做(编写自己的,或扩展HttpURLConnector;或使用套接字),或尝试使用If-Modified-Since和If-None-Match标题并查看对于状态代码304(未修改)。第二个选项可能是最简单的选择,可以帮助您获得最佳效果。