我正在将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小程序运行时,如何禁用或绕过此缓存行为?
答案 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);
我怀疑原因是我的原始网址重定向到另一个网址。上述代码适用于所有情况。