Запретить кеширование в браузере результатов вызова jQuery AJAX - PullRequest
241 голосов
/ 15 декабря 2008

Похоже, что если я загружаю динамический контент, используя $.get(), результат кэшируется в браузере.

Добавление некоторой случайной строки в QueryString, похоже, решает эту проблему (я использую new Date().toString()), но это похоже на хак.

Есть ли другой способ добиться этого? Или, если уникальная строка - единственный способ добиться этого, любые предложения, кроме new Date()?

Ответы [ 20 ]

503 голосов
/ 09 апреля 2009

Следующее действие предотвратит кэширование всех будущих запросов AJAX независимо от того, какой метод jQuery вы используете ($ .get, $ .ajax и т. Д.)

$.ajaxSetup({ cache: false });
295 голосов
/ 09 апреля 2009

JQuery's $ .get () будет кешировать результаты. Вместо

$.get("myurl", myCallback)

вам следует использовать $ .ajax, который позволит вам отключить кеширование:

$.ajax({url: "myurl", success: myCallback, cache: false});
225 голосов
/ 15 декабря 2008

Я использую new Date().getTime(), что позволит избежать коллизий, если в течение одной миллисекунды не происходит несколько запросов:

$.get('/getdata?_=' + new Date().getTime(), function(data) {
    console.log(data); 
});

Редактировать: Этому ответу несколько лет. Это все еще работает (следовательно, я не удалил это), но есть лучшие / более чистые способы достигнуть этого теперь . Я предпочитаю этот метод, но этот ответ также полезен, если вы хотите отключить кэширование для каждого запроса в течение срока жизни страницы.

23 голосов
/ 15 декабря 2008

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

response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "Expires", 0 );
18 голосов
/ 21 сентября 2016

Все ответы здесь оставляют след на запрошенном URL-адресе, который будет отображаться в журналах доступа сервера.

Мне нужно решение на основе заголовков без побочных эффектов, и я обнаружил, что этого можно добиться, настроив заголовки, упомянутые в Как управлять кэшированием веб-страниц во всех браузерах? .

Результат, по крайней мере, для Chrome:

$.ajax({
   url: url, 
   headers: {
     'Cache-Control': 'no-cache, no-store, must-revalidate', 
     'Pragma': 'no-cache', 
     'Expires': '0'
   }
});
13 голосов
/ 15 декабря 2008

Лично я чувствую, что метод строки запроса более надежен, чем попытка установить заголовки на сервере - нет гарантии, что прокси или браузер все равно не просто кеширует его (некоторые браузеры хуже других - без имен) .

Я обычно использую Math.random(), но я не вижу ничего плохого в использовании даты (вам не следует выполнять запросы AJAX достаточно быстро, чтобы получить одно и то же значение дважды).

9 голосов
/ 30 апреля 2015

Следуя документации: http://api.jquery.com/jquery.ajax/

Вы можете использовать свойство cache с:

$.ajax({
    method: "GET",
    url: "/Home/AddProduct?",
    data: { param1: value1, param2: value2},
    cache: false,
    success: function (result) {
        // TODO
    }
});
5 голосов
/ 20 апреля 2009

Реальный вопрос в том, зачем вам это не кэшировать. Если он не должен кэшироваться, потому что он все время меняется, сервер должен указать, что не следует кэшировать ресурс. Если он просто иногда изменяется (потому что может измениться один из ресурсов, от которого он зависит), и если клиентский код имеет возможность узнать об этом, он может добавить фиктивный параметр к URL-адресу, который вычисляется по некоторому хэшу или дате последнего изменения из этих ресурсов (это то, что мы делаем в ресурсах сценариев Microsoft Ajax, чтобы они могли кэшироваться вечно, но новые версии могут по-прежнему обслуживаться по мере их появления). Если клиент не может знать об изменениях, сервер должен правильно обрабатывать запросы HEAD и сообщать клиенту, использовать кэшированную версию или нет. Мне кажется, что добавление случайного параметра или указание от клиента никогда не кэшировать - это неправильно, потому что кэшируемость является свойством ресурса сервера, и поэтому следует принимать решение на стороне сервера. Другой вопрос, который нужно задать себе: должен ли этот ресурс действительно обслуживаться через GET или он должен проходить через POST? Это вопрос семантики, но он также имеет последствия для безопасности (существуют атаки, которые работают, только если сервер допускает GET). POST не будет кэшироваться.

5 голосов
/ 16 декабря 2008

А как насчет использования запроса POST вместо GET ...? (Что вы должны все равно ...)

4 голосов
/ 15 декабря 2008

Возможно, вам следует вместо этого посмотреть на $ .ajax () (если вы используете jQuery, как это выглядит). Взгляните на: http://docs.jquery.com/Ajax/jQuery.ajax#options и опцию «кеш».

Другой подход - посмотреть, как вы кешируете вещи на стороне сервера.

...