小编典典

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

ajax

众所周知,Internet Explorer会积极地缓存ajax调用,而所有其他浏览器每次都会重新获取数据。这通常是不好的:我从未遇到过我希望Ajax不联系服务器的情况。Firefox,Safari和其他浏览器都知道这一点,并且不会缓存ajax调用。

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

  • 向查询字符串中添加一个清除缓存令牌(如?time=[timestamp]
  • 发送专门禁止IE缓存请求的HTTP响应标头
  • 使用ajax POST而不是GET

我更喜欢设置一个无缓存头。这是正确的方法:它告诉所有浏览器不要缓存,这正是您想要的。查询字符串方法用永远无法检索的内容填充浏览器的缓存,从而为合法的缓存内容留出了更少的空间。POST方法破坏了HTTP:POST用于修改数据。

在Grails中,为所有ajax请求自动发送请勿缓存标头的最佳方法是什么?我不想修改任何控制器,所以我认为必须有一个很酷的过滤器技巧或类似的东西。

谢谢!


阅读 209

收藏
2020-07-26

共1个答案

小编典典

这就是我最终想出的。大多数JavaScript库-包括jQuery,YUI,Mootools和Prototype- X-Requested-With: XmlHttpRequest在每个ajax请求中发送标头。

对于发送此标头的任何请求,您都可以发送回响应标头,告诉它不要缓存。

下面是一个Grails过滤器,该过滤器可防止缓存以X-Requested-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')
                }
            }
        }
    }
}

有些人更喜欢使用Cache-Control:no-cache标头而不是过期。区别在于:

  • 缓存控制:无缓存 -绝对无缓存
  • 到期:-1- 浏览器“通常”通过条件If-Modified-Since请求与Web服务器联系以更新该页面。但是,该页面保留在磁盘缓存中,并在适当的情况下使用而无需联系远程Web服务器,例如,当使用BACK和FORWARD按钮访问导航历史记录时,或者当浏览器处于脱机模式时。

通过添加此过滤器,您可以使Internet Explorer的缓存与Firefox和Safari所做的一致。

顺便说一句,我在IE8和IE9上遇到了缓存问题。我认为IE7和IE6也存在问题。

2020-07-26