从Jetty服务器禁用REST请求的客户端缓存
我有一个在Jetty上运行的Jersey实现的REST Java服务器。似乎某些浏览器(IE7)内部缓存了对服务器的所有请求。
我想做的是在REST服务器的响应中发送某个HTTP标头,以指示浏览器不应缓存该响应,因此下次需要访问该资源时,它将再次查询服务器。
关于如何为此配置Jersey / Jetty的任何想法?
还是配置它的唯一方法是客户端?
解决方案
关于恶意客户端,我们无能为力,但是Jetty可以发送适当的HTTP标头。在此处尝试获取有关配置Last-Modified和Cache-Control标头的信息。
在服务器端,如果可以访问响应,则可以尝试执行此操作(我们可以通过过滤器来执行此操作)。
response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Expires", "0");
我们可以在客户端尝试的另一种技巧是在网址中添加多余的参数,例如" http://www.company.com/services/staff?id=xxx&requestTime="+(new Date())。getTime() ;这样,每次被请求的url都不相同,因此无法缓存。
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
@Dave Cheney:好吧,我从http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9了解到,缓存控制对于请求和响应都是有意义的。当响应是由缓存控制的响应时,它是客户端(浏览器)应如何处理资源的规范(请参阅下一节14.9.1)。
@all:而且,在同一文档的第14.21节中,将Expires标头设置为0表示"无效日期",并且可以被客户端忽略。我的发送过期日期为1970年1月1日(时间戳0)的测试仅导致IE(以及ff)的忽略,这仍然会缓存响应。
我的解决方案是将Expires字段的当前日期发送给该规范。