首页 文章

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

提问于
浏览
3

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

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

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

4 回答

  • 2

    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日期被解释为"already expired"

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

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

  • 0

    关于流氓客户端你无能为力,但Jetty可以发送适当的HTTP头 . 有关配置Last-Modified和Cache-Control标头的信息,请尝试使用here .

  • 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

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

相关问题