java - 为什么我的 Java 应用程序仅获取旧版本的在线文件?

标签 java caching webserver

我有a file online with information about some Minecraft blocks 。当我第一次制作这个测试文件时,我给了它三行和下周日的标题到期日期(无论何时)。我的 Java 应用程序获取这个没问题!

但是,现在我在这个小数据库中又插入了三行,并将到期日期更改为上周,但我的 Java 应用程序仍然显示原始的 3!当我在浏览器中访问该页面时,它会为我提供完整的当前表格。 为什么 Java 应用程序仍然只获取旧版本?

关键代码:

InputStream in;
URLConnection urlc = url.openConnection(); // url is a valid java.net.URL object
urlc.setAllowUserInteraction(false);
urlc.setDoInput(true);
urlc.setDoOutput(false);
urlc.setRequestProperty("User-Agent", "BHMI/3.0.0 (+http://prog.BHStudios.org/BHMI) Java/" + System.getProperty("java.version") + "(" + System.getProperty("java.vm.name") + ")"); // GoDaddy blocks Java clients, so we must have a custom user agent string
urlc.setDefaultUseCaches(false);
urlc.setUseCaches(false);
urlc.connect();
System.out.println("Connection successful! Database expires " + new Date(urlc.getExpiration()));
in = urlc.getInputStream();
int data;
StringBuilder sb = new StringBuilder();
while ((data = in.read()) != -1)
    sb.append((char) data);
System.out.println("RAW DATA:\r\n"+sb);

示例输出:

Connection successful! Database expires Tue Nov 26 00:09:05 EST 2013
RAW DATA:
minecraft:air,Air,0,0,,
minecraft:stone,Stone,1,0,2,
minecraft:grass,Grass,2,0,,

我通过 Windows 控制面板清除了 Java 网络缓存,并使用 CCleaner 清除了本地计算机上的所有缓存和临时文件,但这种情况仍然发生。哎呀,它发生在机器上,所以不可能是这样。 我已经清除了服务器中的所有边缘缓存,所以也不可能是这样。 我什至尝试在告诉我的浏览器使用我的 Java 应用程序的 User-Agent 字符串后下载该文件,它获取了所有 5 行。

请求 header

从我的 Java 应用程序:

GET /http/bhstudios/v2/prog/bhmi/database/get HTTP/1.1
User-Agent: BHMI/3.0.0 (+http://prog.BHStudios.org/BHMI) Java/1.7.0_45(Java HotSpot(TM) 64-Bit Server VM)
Cache-Control: no-cache, must-revalidate, max-age=0, no-store
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Connection: close
Host: BHStudios.org
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

从 Chrome 中,欺骗相同的用户代理字符串:

GET /prog/bhmi/database/get/ HTTP/1.1
Host: prog.bhstudios.org
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: BHMI/3.0.0 (+http://prog.BHStudios.org/BHMI) Java/1.7.0_45(Java HotSpot(TM) 64-Bit Server VM)
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: __cfduid=dc9d0394ed55ebb1214fcbb5fc825626b1385426208553; visitorId=5293ed2b758cb1b5620000b0

响应 header

从我的 Java 应用程序:

HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Tue, 26 Nov 2013 02:17:39 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=d4432e3d81cf9e5b9393f2cca483e4b2d1385432256651; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.bhstudios.org; HttpOnly
X-Powered-By: ASP.NET
X-UA-Compatible: chrome=IE8
CF-RAY: d33155416660862

请注意,可疑的 Cookie 过期expires=Mon, 23-Dec-2019 23:50:00 GMT。这可能是原因吗?

我还注意到,当从 Chrome 获取并使用与我的应用程序相同的 User-Agent 字符串时, header 为:

HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Wed, 27 Nov 2013 17:30:01 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache, must-revalidate, max-age=0, no-store
Pragma: no-cache
Expires: Mon, 18 Nov 2013 10:30:01 America/Phoenix
Content-Description: File Transfer
Content-Disposition: attachment; filename=BHMI_Items_Vanilla_172.csv
Content-Transfer-Encoding: base64
X-Powered-By: ASP.NET
X-UA-Compatible: chrome=IE8
CF-RAY: d408b3c56320098
Content-Encoding: gzip

这是预期的 header ,到期日期为上周。

最佳答案

您必须输入您正在查找未缓存数据的请求 header 信息:

  urlc.setRequestProperty("Cache-Control","no-cache, must-revalidate"); //HTTP 1.1
  urlc.setRequestProperty("Pragma","no-cache"); //HTTP 1.0

关于java - 为什么我的 Java 应用程序仅获取旧版本的在线文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20207102/

相关文章:

Python2网络服务器: Do not log request from localhost

java - maven javadoc :fix fails to autofix docs

java - 动态多态性

azure - 在 Azure Service Fabric 中实现缓存

java - ArrayList 在调用服务器之间清空

apache - 如何配置 Apache WebServer 以供我拥有的公共(public)域(或静态 IP)访问?

java - Java 中来自 xml 的动态属性

java - 递归移动目录并在Java中合并它们的有效方法

caching - Aerospike 特定于 setName 的配置

silverlight - 防止 Silverlight xap 被代理服务器缓存