我有一个页面在单个页面加载中多次发出相同的 JSONP 请求。在大多数浏览器中,这都可以正常工作,但 Safari 会在本地缓存响应,直到重新加载页面为止。即使我在响应中发回 Cache-Control: no-cache header 。
考虑以下示例代码:
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 的一些我不了解的东西。
最佳答案
尝试添加哈希参数 - 浏览器会将其视为新请求,并且不会使用其缓存,但在发出请求之前,哈希之外的所有内容都会被删除。尝试一下,看看它是否有效:
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/>");
}
});
关于javascript - Safari 在本地缓存 JSONP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3981295/