簡體   English   中英

Safari在本地緩存JSONP請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM