3

我有一个 REST Java 服务器,使用在 Jetty 上运行的 Jersey 实现。似乎某些浏览器(IE7)在内部缓存了对服务器的所有请求。

我想做的是在来自 REST 服务器的响应中发送某个 HTTP 标头,指示浏览器它不应该缓存该响应,因此下次它需要访问该资源时将再次查询服务器。

关于如何为此配置 Jersey/Jetty 的任何想法?或者配置它的唯一方法是客户端?

4

4 回答 4

3

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

于 2008-10-04T03:24:52.563 回答
2

对于恶意客户端,您无能为力,但 Jetty 可以发送适当的 HTTP 标头。尝试在此处获取有关配置 Last-Modified 和 Cache-Control 标头的信息。

于 2008-09-24T15:04:09.427 回答
2

在服务器端,如果您可以访问响应,则可以尝试此操作(您可能可以通过过滤器进行操作)。

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都不一样,不能缓存。

于 2008-09-24T15:05:53.263 回答
0

@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 字段的当前日期,这就是规范所说的。

于 2010-02-02T14:58:11.803 回答