从Jetty服务器禁用客户端缓存以获取REST请求

时间:2008-09-24 14:59:26

标签: http rest caching jetty jersey

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

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

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

4 个答案:

答案 0 :(得分: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日期被解释为“已经过期”< / p>

http://www.mnot.net/cache_docs/#EXPIRES

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21

答案 1 :(得分:2)

您无法对恶意客户端做任何事情,但Jetty可以发送相应的HTTP标头。请尝试here获取有关配置Last-Modified和Cache-Control标头的信息。

答案 2 :(得分: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都是不同的,并且无法缓存。

答案 3 :(得分:0)

@Dave Cheney:嗯,我从http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9理解的是,Cache-control对请求和响应都有意义。当响应是缓存控制的响应时,它是客户端(浏览器)应该对资源执行的操作的规范(参见下一节,14.9.1)。

@all:此外,在同一文档的第14.21节中,它指定设置为0的Expires标头表示“无效日期”,客户端可以忽略它。我的测试发送日期为1970年1月1日(时间戳0)只会导致IE(以及ff)忽略,这仍然会缓存响应。

我的解决方案是发送Expires字段的当前日期,这是规范所说的。