2010-10-20 4 views
1

J'ai une page qui effectue la même demande JSONP plusieurs fois dans un chargement de page unique. Dans la plupart des navigateurs, cela fonctionne correctement, mais Safari met en cache la réponse localement jusqu'à ce que la page soit rechargée. Même lorsque je renvoie un en-tête Cache-Control: no-cache sur la réponse.Safari met en cache les demandes JSONP localement

considèrent le code exemple suivant:

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/>"); 
    } 
}); 

retours Première demande:

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'); 

Les appels suivants servent à partir du cache local, plutôt que de frapper le serveur comme ils le devraient.

Vous vous demandez probablement ce que cette partie supplémentaire au début concerne la fonction de rappel. Je pourrais juste utiliser un nombre aléatoire là-bas, non? Pas vraiment. Nous évitons le travail de rendu supplémentaire en mettant en cache la totalité de la sortie, en fonction de l'URL demandée. Donc, si je change le nom de la fonction de rappel à chaque requête, je perds les avantages du cache du serveur.

Je pense peut-être ajouter un paramètre garbage à la demande et faire en sorte que le cache du serveur soit supprimé de l'URL lors de la création de la clé de cache. Mais je voulais voir s'il y avait une meilleure option en premier ... quelque chose à propos de Safari que je ne connais pas.

+0

Pourquoi n'utilisez-vous pas getJSON? http://api.jquery.com/jQuery.getJSON/ Fait la même chose à la fin. – epascarello

+0

getJSON n'a pas la possibilité de définir le callback comme je le fais. Se base sur le paramètre par défaut, qui crée un nombre aléatoire à chaque fois. –

Répondre

0

il semble qu'il se passe sur IE aussi, vous pouvez définir le cache false dans l'appel ajax:

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

cache = false ajoute simplement le paramètre garbage que j'ai mentionné à la fin de ma question. (au moins, je pense que c'est tout ce qu'il fait) –

+0

(double vérification de la source jQuery, c'est tout ce qu'il fait) –

1

Essayez d'ajouter un paramètre de hachage - le navigateur verra cela comme une nouvelle demande, et ne sera pas utilise son cache, mais tout ce qui est au-delà du hash est supprimé avant que la requête ne soit faite. Donner un tourbillon et le voir fonctionne:

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/>"); 
    } 
}); 
Questions connexes