Java Webstart 和 URLConnection 缓存 API

2024-05-02

的描述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 稳定版本中似乎未激活,因此我无法验证代码中是否存在错误,因此犹豫是否要提交错误报告。


到目前为止我找到的唯一信息是JDK 7 中的 Java 富互联网应用程序增强 http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/enhancements-7.html

默认启用缓存:现在默认启用在 Web Start 模式下运行的应用程序代码的网络内容缓存。这使得应用程序能够提高性能并与小程序执行模式保持一致。为了确保使用内容的最新副本,应用程序可以使用URLConnection.setUseCaches(false) http://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html#setUseCaches%28boolean%29或请求标头 Cache-Control 值 no-cache/no-store。

[...]

使用 gzip 编码处理内容的改进:部署缓存将以压缩形式保存应用程序内容,并在 HTTP 标头中使用 gzip 内容编码将其按原样返回到应用程序。这使得不同执行模式之间的行为更加一致(首次启动与后续启动、启用缓存与禁用缓存)。看6575586 https://bugs.java.com/bugdatabase/view_bug?bug_id=6575586更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Webstart 和 URLConnection 缓存 API 的相关文章

随机推荐