我正在下载一个JAR文件,并希望使用If-Modified-Since,所以如果我不需要它,我不会得到整个文件,但由于某种原因,我的香草Apache(afaik)没有正确返回304。
这是来自wireshark:
GET /whatever.jar HTTP/1.1
If-Modified-Since: Sat, 04 Jan 2014 21:46:26 GMT
User-Agent: Jakarta Commons-HttpClient/3.1
Host: example.com
HTTP/1.1 200 OK
Date: Sat, 04 Jan 2014 20:32:31 GMT
Server: Apache/2.2.4 (Unix) mod_ssl/2.2.4 OpenSSL/0.9.8e DAV/2 mod_jk/1.2.26 PHP/5.3.6 SVN/1.4.4
Last-Modified: Sat, 04 Jan 2014 19:13:14 GMT
ETag: "b6c037-1ddad9f-d17a6680"
Accept-Ranges: bytes
Content-Length: 31305119
Vary: User-Agent
Content-Type: text/plain
... [bunch of bytes] ...
我不需要指定其他标头,是吗? 我是否缺少 Apache 正确读取此标头所需的模块?
还有其他想法或建议吗?
这是我的 Java 代码,供参考:
File jarFile = new File(filePath);
GetMethod get = new GetMethod(downloadUrl);
Date lastModified = new Date(jarFile.lastModified());
get.setRequestHeader("If-Modified-Since", DateUtil.formatDate(lastModified));
HttpClient client = new HttpClient();
int code = client.executeMethod(get);
更新:解决方案
If-Modified-Date
需要与服务器完全匹配,我通过在下载的文件上显式设置lastModifiedDate
来实现这一点:
String serverModified = get.getResponseHeader("Last-Modified").getValue();
jarFile.setLastModified(DateUtil.parseDate(serverModified).getTime());
执行此操作后,后续调用将不会下载该文件。
为了使用"If-Modified-Since"标头,您必须发送与"上次修改"标头相同的标头值,即 Sat, 04 Jan 2014 19:13:14 GMT
!= Sat, 04 Jan 2014 21:46:26 GMT
。Apache不能保证文件没有被修改,并且故意给出过去的时间(也许是通过版本控制回滚)。
如果需要,可以在客户端检查"上次修改时间"标头,方法是首先使用 HeadMethod 来避免在资源尚未修改时"获取"资源。然后,如果它已被修改,您将使用"GetMethod"。
有关详细信息,请参见第 RFC2616 - 第 9 节"HTTP/1.1:方法定义"。