Tob*_*lte 27 java caching urlconnection httpurlconnection java-web-start
URLConnection缓存API的描述表示为最后一句:
Java 2 Standard Edition中没有URLConnection缓存的默认实现.但是,Java Plugin和Java WebStart确实提供了一个开箱即用的功能.
在哪里可以找到有关Webstart ResponseCache的更多信息?
使用以下(groovy)代码
def url = new URL('http://repo1.maven.org/maven2/')
def connection = url.openConnection()
def result = connection.inputStream.text
Run Code Online (Sandbox Code Playgroud)
我希望每次执行代码时都会联系服务器.但是在执行时
Java Web Start 10.9.2.05
JRE-Version verwenden 1.7.0_09-b05 Java HotSpot(TM) Client VM
Run Code Online (Sandbox Code Playgroud)
行为是不同的.第一次执行代码时,会联系服务器.所有后续的代码执行都不涉及与服务器的任何通信(使用wireshark跟踪).
但它变得更加奇怪.重新启动webstart应用程序后,第一次执行代码时,http://repo1.maven.org/maven2/.pack.gz请求url 导致a 404.仅请求原始网址导致a 304 NOT MODIFIED.所有后续执行都不涉及与服务器的任何通信.
我认为通过缓存功能透明地增强urlconnection的方法很好,很好,有助于提高客户端应用程序的性能.但由于本例中的服务器没有定义Expires头,也没有定义缓存控制头,我认为上面的代码应该总是询问服务器而不是默默地忽略我的请求.
以下代码在使用webstart 10.1.1.255执行时不起作用(这是由java 7的早期测试版安装的,但我不知道这是哪一个)
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();
Run Code Online (Sandbox Code Playgroud)
使用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)
Run Code Online (Sandbox Code Playgroud)
有了这两个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获取请求进行积极的调整:它确实使用了If-Modified-Since并自动尝试使用gzip编码 - 即使客户端代码没有设置此标头.但是当高速缓存被命中时,返回的流不会被gzip压缩,尽管getContentEncoding返回"gzip".
由于缓存似乎在我的机器上的稳定版webstart中没有活动,我无法验证错误是否在代码中,因此不愿提交错误报告.
到目前为止,我找到的唯一信息是JDK 7 中的 Java Rich Internet 应用程序增强
默认启用缓存:现在默认启用在 Web Start 模式下运行的应用程序代码的网络内容缓存。这使得应用程序能够提高性能并与小程序执行模式保持一致。为了确保使用内容的最新副本,应用程序可以使用URLConnection.setUseCaches(false)或请求标头 Cache-Control 值 no-cache/no-store。
[...]
使用 gzip 编码处理内容的改进:部署缓存将以压缩形式保存应用程序内容,并在 HTTP 标头中使用 gzip 内容编码将其按原样返回到应用程序。这使得不同执行模式之间的行为更加一致(首次启动与后续启动、启用缓存与禁用缓存)。请参阅6575586了解更多详情。
| 归档时间: |
|
| 查看次数: |
2902 次 |
| 最近记录: |