我有一个页面在单个页面加载中多次生成相同的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的一些内容。
答案 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/>");
}
});