URLConnection缓存API的描述中最后一句话是:
在Java 2标准版中没有默认的实现方式来进行URLConnection缓存。但是,Java插件和Java WebStart提供了一个开箱即用的实现。
我在哪里可以找到有关Webstart ResponseCache的更多信息?
- 哪些平台上的Webstart版本激活了缓存?
- 在哪些情况下它是活跃的?只有HTTP Get吗?
- 它可以进行配置吗?
- 源代码是否可用?
背景:
案例1
使用以下(Groovy)代码
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应用程序之后,第一次执行代码时,会请求url http://repo1.maven.org/maven2/.pack.gz
,导致404
错误。只有这之后才会请求原始的url,并返回304 NOT MODIFIED
。所有后续的执行都不涉及任何与服务器的通信。
我认为透明地增强URLConnection的缓存功能的方法很好,可以帮助提高客户端应用程序的性能。但由于服务器在这种情况下没有定义Expires头也没有定义cache-control头,因此我认为上面的代码应该总是向服务器发出请求而不是默默地忽略我的请求。
案例二
以下代码在使用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稳定版本中激活,因此我无法验证bug是否存在,因此犹豫要提交bug报告。