Grails:在每次ajax调用中发送缓存头的最佳方法

Grails:在每次ajax调用中发送缓存头的最佳方法,ajax,internet-explorer,caching,grails,Ajax,Internet Explorer,Caching,Grails,众所周知,所有其他浏览器每次都会获取新鲜的数据。这通常很糟糕:我从未遇到过希望ajax不联系服务器的情况。Firefox、Safari和其他浏览器都知道这一点,不会缓存ajax调用 要防止IE缓存,必须执行以下操作之一: 向查询字符串添加缓存破坏令牌(如?time=[timestamp]) 发送明确禁止IE缓存请求的HTTP响应头 使用ajax POST而不是GET 我更喜欢设置无缓存头。这是正确的方法:它告诉所有浏览器不要缓存,这正是您想要的。查询字符串方法用永远无法检索的内容填充浏览器的

众所周知,所有其他浏览器每次都会获取新鲜的数据。这通常很糟糕:我从未遇到过希望ajax不联系服务器的情况。Firefox、Safari和其他浏览器都知道这一点,不会缓存ajax调用

要防止IE缓存,必须执行以下操作之一:

  • 向查询字符串添加缓存破坏令牌(如
    ?time=[timestamp]
  • 发送明确禁止IE缓存请求的HTTP响应头
  • 使用ajax POST而不是GET
我更喜欢设置无缓存头。这是正确的方法:它告诉所有浏览器不要缓存,这正是您想要的。查询字符串方法用永远无法检索的内容填充浏览器的缓存,从而减少了合法缓存内容的空间。POST方法是HTTP的一个缺陷:POST用于修改数据

在Grails中,自动为所有ajax请求发送do-not-cache头的最佳方法是什么?我不想修改任何控制器,所以我认为应该有一个很酷的过滤技巧之类的东西


谢谢

我们对所有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服务器的情况下在适当的情况下使用,例如使用“后退”和“前进”按钮访问导航历史记录或浏览器处于脱机模式时
通过添加此过滤器,可以使Internet Explorer的缓存与Firefox和Safari的缓存保持一致


顺便说一句,我在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')
                }
            }
        }
    }
}