Grails:在每次ajax调用中发送缓存头的最佳方法
众所周知,所有其他浏览器每次都会获取新鲜的数据。这通常很糟糕:我从未遇到过希望ajax不联系服务器的情况。Firefox、Safari和其他浏览器都知道这一点,不会缓存ajax调用 要防止IE缓存,必须执行以下操作之一:Grails:在每次ajax调用中发送缓存头的最佳方法,ajax,internet-explorer,caching,grails,Ajax,Internet Explorer,Caching,Grails,众所周知,所有其他浏览器每次都会获取新鲜的数据。这通常很糟糕:我从未遇到过希望ajax不联系服务器的情况。Firefox、Safari和其他浏览器都知道这一点,不会缓存ajax调用 要防止IE缓存,必须执行以下操作之一: 向查询字符串添加缓存破坏令牌(如?time=[timestamp]) 发送明确禁止IE缓存请求的HTTP响应头 使用ajax POST而不是GET 我更喜欢设置无缓存头。这是正确的方法:它告诉所有浏览器不要缓存,这正是您想要的。查询字符串方法用永远无法检索的内容填充浏览器的
- 向查询字符串添加缓存破坏令牌(如
)?time=[timestamp]
- 发送明确禁止IE缓存请求的HTTP响应头
- 使用ajax POST而不是GET
谢谢 我们对所有ajax调用都使用jQuery,因此我们将此块添加到main.gsp(顶级布局)中:
jQuery(文档).ready(函数(){
$.ajaxSetup({
缓存:false
});
});
也回答了以下是我最后的答案。大多数javascript库——包括jQuery、YUI、Mootools和Prototype——在每个ajax请求上发送
X-request-With:XmlHttpRequest
头
对于发送此标头的任何请求,您都可以发送一个响应标头,告诉它不要缓存
下面是一个Grails过滤器,用于防止缓存使用X-request-with:XmlHttpRequest
头标识自己的ajax请求:
// put this class in grails-app/config/
class AjaxFilters {
def filters = {
all(controller:'*', action:'*') {
before = {
if (request.getHeader('X-Requested-With')?.equals('XMLHttpRequest')) {
response.setHeader('Expires', '-1')
}
}
}
}
}
有些人更喜欢使用缓存控制:无缓存头而不是过期。区别在于:
- 缓存控制:无缓存-绝对无缓存
- 过期:-1-浏览器“通常”通过条件(如果自请求修改)与Web服务器联系以更新该页面。但是,该页面仍保留在磁盘缓存中,并在不联系远程Web服务器的情况下在适当的情况下使用,例如使用“后退”和“前进”按钮访问导航历史记录或浏览器处于脱机模式时
顺便说一句,我在IE8和IE9上遇到了缓存问题。我认为IE7和IE6也存在这个问题。如果进行AJAX调用的网页位于另一个网站上会怎么样?示例:您提供了一个API…很酷,谢谢@david betts。我们正在使用YUI,但我只是查看了一下,它具有相同的功能。如果有必要,我会用这个。。。然而,我宁愿在服务器上控制它,因为向URL添加内容可能会产生副作用。如果明天之前没有人给出服务器端的答案,我会接受这个答案。如果在完成此设置后通过jQuery对任何系统进行ajax调用,我的期望是它不会被缓存,因为它会在每个请求中附加一个时间戳。是否有某种方法可以使用url映射或检测JSON内容类型来检测ajax调用?如果是这样的话,那么您可以添加一个过滤器来执行此操作:
response.setHeader“Cache Control”,“no Cache”
@david betts对,我想我可以在Grails过滤器中设置某种post过滤器来设置缓存头,但我不太确定,因为此时响应可能已经提交了。我并没有探索自己,而是希望有人已经这么做了……问题肯定也在IE7上。Thx帮助了我们。您还可以使用if(request.xhr)来确定您的请求是否通过AJAX。
// put this class in grails-app/config/
class AjaxFilters {
def filters = {
all(controller:'*', action:'*') {
before = {
if (request.getHeader('X-Requested-With')?.equals('XMLHttpRequest')) {
response.setHeader('Expires', '-1')
}
}
}
}
}