Safari кэширует JSONP-запросы локально - PullRequest
1 голос
/ 20 октября 2010

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

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Попробуйте добавить параметр хеша - браузер увидит это как новый запрос и не будет использовать свой кеш, но все, что находится за пределами хеша, удаляется до того, как запрос будет сделан. Дайте этому вихрь и убедитесь, что он работает:

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/>");
    }
});
0 голосов
/ 20 октября 2010

похоже, что это происходит и в IE, вы можете установить кеш в false при вызове ajax:

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