Ответ 1
Вот что я, наконец, понял. Большинство javascript-библиотек, включая jQuery, YUI, Mootools и Prototype, отправляют заголовок X-Requested-With: XmlHttpRequest
для каждого запроса ajax.
Для любого запроса, который отправляет этот заголовок, вы можете отправить ответный заголовок ответа, который сообщает ему, что он не кэшируется.
Ниже приведен фильтр Grails, который предотвращает кэширование ajax-запросов, которые идентифицируют себя с заголовком X-Requested-With: XmlHttpRequest
:
// put this class in grails-app/config/
class AjaxFilters {
def filters = {
all(controller:'*', action:'*') {
before = {
if (request.getHeader('X-Requested-With')?.equals('XMLHttpRequest')) {
response.setHeader('Expires', '-1')
}
}
}
}
}
Некоторые люди предпочитают использовать заголовок Cache-Control: no-cache вместо истечения срока действия. Здесь разница:
- Cache-Control: no-cache - абсолютно без кэширования
- Истекает: -1 - браузер "обычно" связывается с веб-сервером для обновления этой страницы с помощью условного запроса If-Modified-Since. Однако страница остается в дисковой кеше и используется в соответствующих ситуациях без обращения к удаленному веб-серверу, например, когда кнопки BACK и FORWARD используются для доступа к истории навигации или когда браузер находится в автономном режиме.
Добавив этот фильтр, вы делаете кеширование Internet Explorer совместимым с тем, что уже делают Firefox и Safari.
Кстати, я столкнулся с проблемой кэширования в IE8 и IE9. Я предполагаю, что проблема существует и для IE7 и IE6.