Похоже, что если я загружаю динамический контент $.get()
, результат кэшируется в браузере.
Добавление некоторой случайной строки в QueryString, кажется, решает эту проблему (я использую new Date().toString()
), но это похоже на хак.
Есть ли другой способ добиться этого? Или, если уникальная строка - единственный способ добиться этого, есть какие-то предложения, кроме new Date()
?
javascript
jquery
ajax
browser-cache
Salamander2007
источник
источник
$.now()
вместо выполнения (new Date (). GetTime ()) каждый раз.Ответы:
Я использую
new Date().getTime()
, что позволит избежать коллизий, если у вас есть несколько запросов, происходящих в течение одной миллисекунды:Изменить: этому ответу несколько лет. Это все еще работает (следовательно я не удалил это), но есть лучшие / более чистые способы достигнуть этого теперь . Я предпочитаю этот метод, но этот ответ также полезен, если вы хотите отключить кэширование для каждого запроса во время жизни страницы.
источник
new Date().getTime()
код используется как это ...var nocache = new Date().getTime(); var path = 'http://hostname.domain.tld/api/somejsonapi/?cache=' + nocache;
. Мне потребовалось несколько минут, чтобы понять это сам. Конечно, это?cache
может быть любая формулировка, которую API на самом деле не хочет.url = url + (-1 === url.indexOf('?') ? '?' : '&') + "__=" + Number(new Date());
Следующее действие предотвратит кэширование всех будущих запросов AJAX независимо от того, какой метод jQuery вы используете ($ .get, $ .ajax и т. Д.)
источник
$ .Get () JQuery будет кэшировать результаты. Вместо того
вы должны использовать $ .ajax, который позволит вам отключить кеширование:
источник
Все ответы здесь оставляют след на запрошенном URL, который будет отображаться в журналах доступа сервера.
Мне нужно было решение на основе заголовков без побочных эффектов, и я обнаружил, что этого можно добиться, установив заголовки, упомянутые в разделе Как контролировать кэширование веб-страниц во всех браузерах? ,
Результат, по крайней мере, для Chrome:
источник
Другой способ - не предоставлять заголовки кэша со стороны сервера в коде, который генерирует ответ на вызов ajax:
источник
Лично я чувствую, что метод строки запроса более надежен, чем попытка установить заголовки на сервере - нет гарантии, что прокси или браузер все равно не просто кеширует его (некоторые браузеры хуже других - не называя имен).
Я обычно использую,
Math.random()
но я не вижу ничего плохого в использовании даты (вам не следует выполнять запросы AJAX достаточно быстро, чтобы получить одно и то же значение дважды).источник
Следующая документация: http://api.jquery.com/jquery.ajax/
Вы можете использовать
cache
свойство с:источник
Конечно, методы «взлома кеша» выполнят работу, но в первую очередь этого не произойдет, если сервер сообщит клиенту, что ответ не должен кэшироваться. В некоторых случаях полезно кэшировать ответы, иногда нет. Пусть сервер решит правильное время жизни данных. Вы можете изменить это позже. Гораздо проще сделать это с сервера, чем из разных мест в вашем коде пользовательского интерфейса.
Конечно, это не поможет, если у вас нет контроля над сервером.
источник
Как насчет использования запроса POST вместо GET ...? (Что вы все равно должны ...)
источник
На самом деле вопрос в том, зачем вам это не кэшировать. Если он не должен кэшироваться, потому что он все время меняется, сервер должен указать, что не следует кэшировать ресурс. Если он просто иногда изменяется (потому что может измениться один из ресурсов, от которого он зависит), и если клиентский код имеет возможность узнать об этом, он может добавить фиктивный параметр к URL-адресу, который вычисляется по некоторому хэшу или дате последнего изменения из этих ресурсов (это то, что мы делаем в ресурсах сценариев Microsoft Ajax, чтобы они могли кэшироваться вечно, но новые версии могут по-прежнему обслуживаться по мере их появления). Если клиент не может знать об изменениях, сервер должен правильно обрабатывать запросы HEAD и сообщать клиенту, использовать кэшированную версию или нет. Мне кажется, что добавление случайного параметра или указание от клиента никогда не кэшировать - это неправильно, потому что кэшируемость является свойством ресурса сервера, и поэтому следует принимать решение на стороне сервера. Другой вопрос, который нужно задать себе: должен ли этот ресурс действительно обслуживаться через GET или он должен проходить через POST? Это вопрос семантики, но он также имеет последствия для безопасности (существуют атаки, которые работают, только если сервер допускает GET). POST не будет кэшироваться.
источник
Возможно, вам следует взглянуть на $ .ajax () (если вы используете jQuery, как это выглядит). Взгляните на: http://docs.jquery.com/Ajax/jQuery.ajax#options и опцию «кеш».
Другой подход - посмотреть, как вы кешируете вещи на стороне сервера.
источник
Небольшое дополнение к полученным отличным ответам: Если вы работаете с решением для резервного копирования не-ajax для пользователей без javascript, вам все равно придется корректировать заголовки на стороне сервера. Это не невозможно, хотя я понимаю тех, кто бросает это;)
Я уверен, что есть еще один вопрос о SO, который даст вам полный набор заголовков, которые подходят. Я не совсем убежден, что мышиный ответ охватывает все основания на 100%
источник
Для тех из вас, кто использует
cache
опцию$.ajaxSetup()
на мобильном Safari, может показаться, что вам нужно использовать временную метку для POST, поскольку мобильный Safari также кеширует ее. Согласно документации$.ajax()
(на которую вы направлены от$.ajaxSetup()
):Так что установка этой опции сама по себе не поможет вам в случае, о котором я упоминал выше.
источник
По сути, просто добавьте
cache:false;
в ajax, где вы думаете, что контент будет меняться по мере продвижения. И место, где контент не изменится, вы можете пропустить. Таким образом, вы получите новый ответ каждый разисточник
Ajax-кэширование в Internet Explorer: что вы собираетесь с этим делать? предлагает три подхода:
источник
Теперь это легко сделать, включив / отключив опцию кэширования в вашем запросе ajax, вот так
источник
Если вы используете IE 9, то вам нужно использовать следующее перед определением класса вашего контроллера:
[OutputCache (NoStore = true, Duration = 0, VaryByParam = "*")]
Открытый класс TestController: контроллер
Это предотвратит кеширование браузера.
Подробности по этой ссылке: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/
На самом деле это решило мою проблему.
источник
Как сказал @Athasach, согласно документам jQuery,
$.ajaxSetup({cache:false})
он не будет работать для запросов, отличных от GET и HEAD.Вам все
Cache-Control: no-cache
равно лучше отправлять заголовок с вашего сервера. Это обеспечивает более четкое разделение проблем.Конечно, это не будет работать для сервисных URL, которые не принадлежат вашему проекту. В этом случае вы можете рассмотреть возможность передачи сторонней службы из кода сервера, а не вызывать ее из кода клиента.
источник
Если вы используете .net ASP MVC, отключите кэширование в действии контроллера, добавив следующий атрибут в функцию конечной точки:
источник
добавить заголовок
источник
добавить
Math.random()
к запросу URLисточник