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

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

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

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

Ответы [ 20 ]

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

Конечно, методы «взлома кеша» выполнят работу, но в первую очередь этого не произойдет, если сервер сообщит клиенту, что ответ не должен кэшироваться. В некоторых случаях полезно кэшировать ответы, иногда нет. Пусть сервер решит правильное время жизни данных. Вы можете изменить это позже. Гораздо проще сделать это с сервера, чем из разных мест в вашем коде пользовательского интерфейса.

Конечно, это не поможет, если у вас нет контроля над сервером.

3 голосов
/ 06 мая 2013

Для тех, кто использует параметр cache, равный $.ajaxSetup() в мобильном Safari, может показаться, что вам может понадобиться использовать временную метку для POST, поскольку мобильный Safari также кэширует это. Согласно документации на $.ajax() (на которую вы направлены от $.ajaxSetup()):

Установка кэша в false будет корректно работать только с HEAD и GET-запросами. Это работает путем добавления "_ = {timestamp}" к параметрам GET. Параметр не нужен для других типов запросов, кроме IE8, когда выполняется POST для URL, который уже был запрошен GET.

Так что установка только этой опции не поможет вам в случае, о котором я упоминал выше.

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

Небольшое дополнение к полученным отличным ответам: Если вы работаете с решением резервного копирования без Ajax для пользователей без javascript, вам все равно придется корректировать заголовки на стороне сервера. Это не невозможно, хотя я понимаю тех, кто сдается;)

Я уверен, что есть еще один вопрос о SO, который даст вам полный набор заголовков, которые подходят. Я не совсем убежден, что мышиный ответ охватывает все основания на 100%.

2 голосов
/ 24 ноября 2015

Теперь это легко сделать, включив / отключив функцию кэширования в вашем запросе ajax, как это

$(function () {
    var url = 'your url goes here';
    $('#ajaxButton').click(function (e) {
        $.ajax({
            url: url,
            data: {
                test: 'value'
            },
                cache: true, //cache enabled, false to reverse
                complete: doSomething
            });
        });
    });
    //ToDo after ajax call finishes
    function doSomething(data) {
        console.log(data);
    }
});
2 голосов
/ 13 августа 2014

Ajax-кэширование в Internet Explorer: что вы собираетесь с этим делать? предлагает три подхода:

  1. Добавьте токен очистки кэша в строку запроса, например? Date = [timestamp]. В jQuery и YUI вы можете сказать им делать это автоматически.
  2. Использовать POST вместо GET
  3. Отправляет заголовок ответа HTTP, который специально запрещает браузерам кэшировать его
2 голосов
/ 22 января 2014

В основном просто добавьте cache:false; в ajax, где, по вашему мнению, содержимое будет меняться по мере продвижения. И место, где контент не изменится, вы можете пропустить. Таким образом, вы будете получать новый ответ каждый раз

1 голос
/ 02 декабря 2012

Если вы используете IE 9, то перед определением класса контроллера вам необходимо использовать следующее:

[OutputCache (NoStore = true, Duration = 0, VaryByParam = "*")]

открытый класс TestController: Controller

Это предотвратит кеширование браузера.

Подробности по этой ссылке: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

На самом деле это решило мою проблему.

1 голос
/ 16 мая 2015

Если вы используете .net ASP MVC, отключите кэширование в действии контроллера, добавив следующий атрибут в функцию конечной точки: [OutputCacheAttribute (VaryByParam = "*", Duration = 0, NoStore = true)]

1 голос
/ 01 августа 2013

Как сказал @Athasach, согласно документам jQuery, $.ajaxSetup({cache:false}) не будет работать для запросов, отличных от GET и HEAD.

Вам все равно лучше отправлять обратно заголовок Cache-Control: no-cache с вашего сервера. Это обеспечивает более четкое разделение проблем.

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

0 голосов
/ 03 декабря 2013

добавьте Math.random () к URL-адресу запроса

...