URLConnection.setUseCaches() 在实践中是如何工作的?

2022-09-02 22:24:43

我有一个小程序,它使用URLConnection通过http连接加载图像。我正在为所有连接设置setUseCaches(true),但仍然没有看到任何缓存行为。我的图像的 HTTP 标头具有合理的缓存设置。如果你看看bug 4528599有这样一个相当神秘的说法:

Java 插件的当前版本 (1.3.1) 仅检查浏览器高速缓存中名称以.jar结尾的文件,或者.class。我被告知,对于Java插件1.4,浏览器缓存将检查以下文件类型:.class,.jar,.zip,.jpg,.gif,.wav,.au。

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

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

这是应该工作的,还是只是另一个破碎的太阳“功能”。有没有办法或解决方法,我可以让我的小程序从浏览器缓存加载PNG图像?我宁愿不实现我自己的....

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

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

因此,在我看来,问题真的变成了:Java插件ResponscheCache实现如何真正工作?v1.4/v1.5/v.16 之间有什么区别

有人有什么想法吗?


答案 1

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

Cache-Control: no-cache

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

现在,仅仅因为请求说它愿意使用缓存,您的服务器可能未设置为启用它们。也许它没有在响应中设置具有适当长时间的 Expires 标头,或者它可能在响应中设置了禁止缓存的缓存控制标头。

其他一些要检查的事项:

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

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


答案 2

抽象类 URLConnection 提供 set/getUseCaches 方法,这些方法由任何子类使用。但是,据我所知,HttpURLConnection类不会以任何方式使用这些字段。将值设置为 true 或 false 不会有任何不同的行为。

如果要添加 http 缓存行为,可以自己操作(编写自己的,或扩展 HttpURLConnector;或使用套接字),或者尝试使用 If-Modified-SinceIf-None-Match 标头并查找状态代码 304(未修改)。第二种选择可能是最简单的,可以让你得到最好的结果。


推荐