我有一个 REST Java 服务器,使用在 Jetty 上运行的 Jersey 实现。似乎某些浏览器(IE7)在内部缓存了对服务器的所有请求。
我想做的是在来自 REST 服务器的响应中发送某个 HTTP 标头,指示浏览器它不应该缓存该响应,因此下次它需要访问该资源时将再次查询服务器。
关于如何为此配置 Jersey/Jetty 的任何想法?或者配置它的唯一方法是客户端?
response.setHeader("Pragma", "no-cache");
不不不!
使用 pragma 标头来禁用客户端缓存是错误的,它是一个请求标头,对响应的影响为零。
http://www.mnot.net/cache_docs/#PRAGMA
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32
此外,设置 Expires: 0 不正确,Expires 应该是一个日期,而不是秒数,但是这将作为无效的 http 日期被解释为“已经过期”
http://www.mnot.net/cache_docs/#EXPIRES
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21
对于恶意客户端,您无能为力,但 Jetty 可以发送适当的 HTTP 标头。尝试在此处获取有关配置 Last-Modified 和 Cache-Control 标头的信息。
在服务器端,如果您可以访问响应,则可以尝试此操作(您可能可以通过过滤器进行操作)。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Expires", "0");
您可以在客户端尝试的另一个技巧是向 url 添加一个多余的参数,例如“ http://www.company.com/services/staff?id=xxx&requestTime= "+(new Date()).getTime() ; 这样每次请求的url都不一样,不能缓存。
@Dave Cheney:嗯,我从http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9了解到缓存控制对请求和响应都有意义。当响应是缓存控制的响应时,它是客户端(浏览器)应该如何处理资源的规范(参见下一节,14.9.1)。
@all:此外,在同一文档的第 14.21 节中,指定设置为 0 的 Expires 标头表示“无效日期”,并且可以被客户端忽略。我的测试将过期日期发送到 1970 年 1 月 1 日(时间戳 0)只会导致 IE 忽略(以及 ff ),它仍然会缓存响应。
我的解决方案是发送 Expires 字段的当前日期,这就是规范所说的。