一尘不染

实际上,URLConnection.setUseCaches()如何工作?

java

我有一个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“功能”。有什么方法或解决方法可以让我的applet从浏览器缓存中加载PNG图像?我宁愿不执行我自己的…。

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

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

因此在我看来,问题实际上变成了:Java Plugin ResponseCache实现如何真正起作用?v1.4 / v1.5 / v.16有什么区别

任何人有任何想法吗?


阅读 679

收藏
2020-12-03

共1个答案

一尘不染

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

Cache-Control: no-cache

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

现在,仅因为该请求表明愿意使用缓存,您的 服务器
可能未设置为启用缓存。可能不是在响应中设置了较长时间的Expires标头,或者是在响应中设置了Cache-Control标头以禁止缓存。

其他需要检查的内容:

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

如果这只是进行Web应用程序测试的通用浏览器,那么您还需要确保您没有单击“刷新”按钮,因为这等效于设置无缓存。

2020-12-03