我在Jetty上运行Jersey时实现了一个REST Java服务器。似乎某些浏览器(IE7)在内部缓存对服务器发出的所有请求。
我想要做的是在REST服务器的响应中发送一个特定的HTTP标头,指示浏览器不应该缓存该响应,因此下次需要访问该服务器时将再次查询服务器资源。
有关如何为此配置Jersey / Jetty的任何想法? 或者配置它的唯一方法是客户端?
答案 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)
@all:此外,在同一文档的第14.21节中,它指定设置为0的Expires标头表示“无效日期”,客户端可以忽略它。我的测试发送日期为1970年1月1日(时间戳0)只会导致IE(以及ff)忽略,这仍然会缓存响应。
我的解决方案是发送Expires字段的当前日期,这是规范所说的。