У меня есть страница, которая делает один и тот же запрос JSONP несколько раз при загрузке одной страницы. В большинстве браузеров это работает нормально, но Safari кэширует ответ локально до тех пор, пока страница не будет перезагружена. Даже когда я отправляю обратно ответ кэша Cache-Control: no-cache.Сафари кэширует запросы JSONP локально
Рассмотрим следующий пример кода:
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, о котором я не знаю.
Почему вы не используете getJSON? http://api.jquery.com/jQuery.getJSON/ Делает то же самое в конце. – epascarello
getJSON не имеет гибкости для определения обратного вызова, как я это делаю. Использует значение по умолчанию, которое создает случайное число каждый раз. –