Java 1.7 applet CacheEntry阻止动态更新

时间:2013-06-19 00:29:37

标签: java caching applet java-7

我正在将Java 1.6 applet迁移到Java 1.7。我们的一个小程序定期点击URL以检索动态状态值:

https://host/myapp/path/to/status

然后根据最新状态值进行更新。自升级到Java 1.7以来,我的客户端不会检索最新的状态值。我在Java控制台中看到这样的条目:

CacheEntry[https://host/myapp/path/to/status]: updateAvailable=true,lastModified=Wed Dec 31 17:00:00 MST 1969,length=82

看起来客户端具有该URL的一些缓存值,并且实际上并未从服务器检索最新的动态值。

这作为1.6 applet工作正常,它也可以作为1.7独立Java应用程序正常工作。如何作为1.7小程序运行时,如何禁用或绕过此缓存行为?

5 个答案:

答案 0 :(得分:3)

我已通过在服务器响应中使用以下HTTP标头解决了此问题:

Cache-Control: no-cache, no-store, no-transform

现在,我的Java 1.7 applet每次都从服务器获取数据。显然,Oracle改变了applet如何响应Java 1.7中的这些头文件。以前(当我们使用Java 1.6 applet时),我们有以下标题:

Cache-Control: no-cache

,这在Java 1.6中有效,但在1.7中没有。

答案 1 :(得分:2)

与Java applet有类似的问题并修复了它:

转到控制面板或系统偏好设置)> Java > 一般> 设置,然后取消选中“在我的计算机上保留临时文件”框。

答案 2 :(得分:0)

我遇到了同样的问题。我尝试使用URLConnection.setUsesCaches(false),但绝对没有。

我必须将以下内容添加到apache的http配置文件中。然后它奏效了。

<Directory /foo>
    <FilesMatch "\.(xml)$">
        Header set Cache-Control "no-cache, no-store, no-transform"
    </FilesMatch>
</Directory>

答案 3 :(得分:0)

我已经解决了这个问题。

我在网址的末尾添加了一些假参数,例如日期时间或每次调用网址时更改的内容。

我自己的解决方案:

我创建了一个日期字符串

SimpleDateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssz" );  
String today = formatter.format( new java.util.Date() );

之后,当我调用url时,我将日期sstring放到url的末尾

new URL("http://url.to.something?fake_query_string=" + today);

使用这个解决方案,它会把java当成一个新的url,所以这个url没有任何缓存,那么java总是会检索数据。

PS。它不是最好的解决方案,但它可以拯救我。

答案 4 :(得分:0)

对我来说,单独使用setUseCaches(false)不起作用。但调用以下两种方法确实有效:

connection.setUseCaches(false);
connection.setDefaultUseCaches(false);

我怀疑原因是我的原始网址重定向到另一个网址。上述代码适用于所有情况。