防止ajax调用缓存的正确方法是什么?

时间:2016-02-01 12:13:41

标签: jquery ajax caching

我有一个AJAX调用,它根据简单的标准参数(如一年中的月份)从不断变化的数据库中返回值。在IE中,此函数返回缓存的数据,这是它永远不应该的。我监控了服务器端,客户端没有联系它。

现在,我的标题问题已经以不同的方式提出,很多时候已经在这里。前两个解决方案是:

  • 设置config.omniauth :myauth, 'CKEY', 'CSEC', strategy_class => OmniAuth::Strategies::Myauth
  • 传递随机数/字符串/时间戳以使呼叫唯一。

事情是,cache: false不起作用,至少在我的应用程序中不起作用。另一方面,传递一个唯一的字符串来防止缓存,似乎是一个快速修复黑客。我不喜欢它。那么在ajax调用上阻止缓存的正确方法是什么?

在防止缓存方面无效的Ajax调用:

cache: false

在调用发生之前,我也试过自己调用$.getJSON("myURL", { json : jsonDataObject, cache: false }).success(function(data) { //do something with data }); ,但是没有效果......

4 个答案:

答案 0 :(得分:10)

首先,您认为在cache电话中将$.getJSON()设置为false的方式不正确。您已将密钥/值对传递给服务器,因此请求网址将显示为site.com/resource?cache=false

您需要使用$.ajax()方法提出请求,以便将cache选项实际设置为false。然而,所有这一切都是你所谓的快速修复黑客"。它将_={current_timestamp}添加到查询字符串中,以便不会缓存请求。

$.ajax({
    url: 'myurl',
    type: 'GET',
    dataType: 'json',
    data: jsonDataObject,
    cache: false, // Appends _={timestamp} to the request query string
    success: function(data) {
        // data is a json object.
    }
});

在我看来,这不是一个快速修复或黑客攻击,它是确保您从服务器获得新响应的正确方法。

如果您不是每次都这样做,那么您可以使用自己的包装函数:

$.getJSONUncached = function (url, data, successCallback) {
    return $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        data: data,
        cache: false, // Appends _={timestamp} to the request query string
        success: successCallback
    });
};

然后,您只需将$.getJSON()的电话号码替换为$.getJSONUncached()

即可

答案 1 :(得分:0)

请告知我们您使用的是IE8,请从jquery文档中查看以下内容

缓存(默认值:true,false,对于dataType'脚本'和' jsonp') 类型:布尔值 如果设置为false,它将强制浏览器不缓存请求的页面。注意:将缓存设置为false只能与HEAD和GET请求一起正常工作。它的工作原理是附加" _ = {timestamp}"到GET参数。 其他类型的请求不需要该参数,但在IE8中,当对已经由GET请求的URL进行POST时,该参数除外。

答案 2 :(得分:0)

使用

$.ajaxSetup({ cache: false });

您的请求中不需要虚假缓存。将此代码用作头脑中的脚本。它将解决您的缓存问题。代码应该,

<script>$.ajaxSetup({ cache: false });</script>

答案 3 :(得分:0)

缓存有HTML META TAG ..我不确定但可能对防止缓存有用。

<meta http-equiv='cache-control' content='no-cache'>
<meta http-equiv='expires' content='0'>
<meta http-equiv='pragma' content='no-cache'>