[英]Safari caches JSONP requests locally
我有一個頁面,在單個頁面加載中多次發出相同的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的一些我不知道的事情。
嘗試添加一個哈希參數-瀏覽器會將其視為一個新請求,並且不會使用其緩存,但是在提出該請求之前,哈希值以外的所有內容都會被刪除。 旋轉一下,看看它是否有效:
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/>");
}
});
似乎它也在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/>");
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.