加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Grails:每个ajax调用发送缓存头的最佳方式

发布时间:2020-12-16 03:05:51 所属栏目:百科 来源:网络整理
导读:众所周知,Internet Explorer aggressively caches ajax calls,而所有其他浏览器每次抓取数据新鲜.这通常是坏的:我从来没有遇到一个我想要ajax不联系服务器的情况. Firefox,Safari和其他浏览器都知道这一点,并且不缓存ajax调用. 为了防止IE缓存,您必须执行以
众所周知,Internet Explorer aggressively caches ajax calls,而所有其他浏览器每次抓取数据新鲜.这通常是坏的:我从来没有遇到一个我想要ajax不联系服务器的情况. Firefox,Safari和其他浏览器都知道这一点,并且不缓存ajax调用.

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

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

我更喜欢设置一个无缓存头.这是正确的方式:它告诉所有浏览器不缓存,这正是你打算的.查询字符串方法用浏览器的缓存填充永远不会被检索的内容,为合法缓存内容留出更少的空间. POST方法是HTTP的损坏:POST用于修改数据.

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

谢谢!

这是我终于想到的.大多数javascript库 – 包括jQuery,YUI,Mootools和Prototype – 在每个ajax请求上发送X-Requested-With:XmlHttpRequest标头.

对于发送此标题的任何请求,您可以发回一个响应标题,指示它不缓存.

以下是一个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:无缓存头,而不是到期.这里有区别:

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

通过添加此过滤器,您可以使Internet Explorer的缓存与Firefox和Safari已经执行的一致.

BTW,我经历了IE8和IE9的缓存问题.我认为IE7和IE6也存在问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读