Safari在本地缓存JSONP请求

时间:2010-10-20 18:54:33

标签: javascript ajax caching safari jsonp

我有一个页面在单个页面加载中多次生成相同的JSONP请求。在大多数浏览器中,这可以正常工作,但Safari会在本地缓存响应,直到重新加载页面为止。即使我在响应中发送了一个Cache-Control:no-cache标头。

考虑以下示例代码:

var plcbCnt = 0;
var plcb = "plcb" + plcbCnt;
while(window[plcb]){
    plcb = "plcb" + (++plcbCnt);
}

$.ajax({
    "url": "http://myserver.com/echoDate",
    "dataType": 'jsonp',
    "jsonp": "cb",
    "jsonpCallback": plcb,
    "success": function(resp){
        $("#pants").html($("#pants").html() + resp + "<br/>");
    }
});

第一个请求返回:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 28
Content-Type: application/javascript
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=g0zwq2qiaheh4145cudddmjo; path=/
X-Powered-By: ASP.NET
Date: Wed, 20 Oct 2010 18:22:12 GMT

plcb0('634231777326425375');

后续调用从本地缓存提供,而不是像他们应该那样命中服务器。

你可能想知道开头的额外部分是关于设置回调函数的。我可以在那里使用随机数,对吗? 并不是的。我们通过根据请求的URL缓存整个输出来避免额外的渲染工作。因此,如果我在每个请求上更改回调函数名称,我将失去服务器缓存的好处。

我能想到的最好的方法是在请求中添加一个垃圾参数,并在创建缓存密钥时使服务器缓存条在URL之外。但我想先看看是否有更好的选择......我不了解Safari的一些内容。

2 个答案:

答案 0 :(得分:1)

尝试添加哈希参数 - 浏览器会将此视为新请求,并且不会使用其缓存,但是在请求发出之前,哈希之外的所有内容都会被删除。给它一个旋转,并看到它的工作原理:

var callback = '#call' + new Date().getTime();
$.ajax({
    "url": "http://myserver.com/echoDate" + callback,
    "dataType": 'jsonp',
    "jsonp": "cb",
    "jsonpCallback": plcb,
    "success": function(resp){
        $("#pants").html($("#pants").html() + resp + "<br/>");
    }
});

答案 1 :(得分:0)

它似乎也发生在IE上,你可以在ajax调用中将cache设置为false:

$.ajax({  
    /*cache: false,*/
    "url": "http://myserver.com/echoDate",
    "dataType": 'jsonp',
    "jsonp": "cb",
    "jsonpCallback": plcb,
    "success": function(resp){
        $("#pants").html($("#pants").html() + resp + "<br/>");
    }
});