的描述URLConnection 缓存 API http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-cache.html最后一句指出:
Java 2 标准版中没有 URLConnection 缓存的默认实现。然而,Java Plugin 和 Java WebStart 确实提供了一种开箱即用的功能。
在哪里可以找到有关 Webstart ResponseCache 的更多信息?
- 哪些版本的 Webstart 在哪些平台上激活缓存?
- 在什么情况下它是活跃的?仅 HTTP 获取?
- 可以配置吗?
- 有源代码吗?
背景:
Case 1
使用以下(常规)代码
def url = new URL('http://repo1.maven.org/maven2/')
def connection = url.openConnection()
def result = connection.inputStream.text
我希望每次执行代码时都会联系服务器。但是当执行时
Java Web Start 10.9.2.05
JRE-Version verwenden 1.7.0_09-b05 Java HotSpot(TM) Client VM
行为不同。第一次执行代码时,会联系服务器。代码的所有后续执行都不涉及与服务器的任何通信(使用wireshark 进行跟踪)。
但这变得更奇怪了。重新启动webstart应用程序后,第一次执行代码时,urlhttp://repo1.maven.org/maven2/.pack.gz
被要求导致404
。仅请求原始 url,从而导致304 NOT MODIFIED
。所有后续执行都不涉及与服务器的任何通信。
我认为通过缓存功能透明地增强 urlconnection 的方法很好,并且有助于提高客户端应用程序的性能。但由于本例中的服务器没有定义 Expires 标头,也没有定义缓存控制标头,所以我认为上面的代码应该始终询问服务器,而不是默默地忽略我的请求。
Case 2
使用 webstart 10.1.1.255 执行时以下代码不起作用(这是由 java 7 的某些早期 beta 版本安装的,但我不知道这是哪一个)
URL url = new URL("http://repo1.maven.org/maven2/");
URLConnection connection = url.openConnection();
connection.setRequestProperty("Accept-Encoding", "gzip");
connection.connect();
InputStream is = connection.getInputStream();
if ("gzip".equalsIgnoreCase(connection.getContentEncoding()))
{
is = new GZIPInputStream(is);
}
is.close();
从第二次执行开始,Java Web Start 10.1.1.255 得到了
java.io.IOException: Not in GZIP format
at java.util.zip.GZIPInputStream.readHeader(Unknown Source)
at java.util.zip.GZIPInputStream.<init>(Unknown Source)
at java.util.zip.GZIPInputStream.<init>(Unknown Source)
既Java Web Start 1.6.0_24
现在Java Web Start 10.2.1.255
我无法重现该问题。
使用 Wireshark,我看到在出现错误的情况下,http 标头包含 If-Modified-Since 条目,因此返回代码为 304。在其他情况下,没有 If-Modified-Since。因此,我认为缓存在 webstart 的稳定版本中并不活跃——尽管上面链接的最后一句是这样的。
看来,测试版的缓存对 http get 请求进行了积极的调整:它确实使用 If-Modified-Since 并自动尝试使用 gzip 编码——即使客户端代码没有设置此标头。但是,当命中缓存时,返回的流不会被 gzip 压缩,尽管getContentEncoding
返回“gzip”。
由于缓存在我的机器上的 webstart 稳定版本中似乎未激活,因此我无法验证代码中是否存在错误,因此犹豫是否要提交错误报告。