У меня есть страница, которая выполняет один и тот же запрос 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, о котором я не знаю.