Разве браузер не может просто использовать свой кеш от предыдущих вызовов ajax? - PullRequest
10 голосов
/ 05 августа 2009

Я пытаюсь рассчитывать на кеш браузера Данные JSON, возвращаемые вызовами AJAX в jQuery.

Нормальная активность браузера постоянно зависит от кеша браузера. Пример: изображения jpg и gif не перезагружаются при перезагрузке страницы.

Но когда я пытаюсь использовать jQuery getJSON ajax-вызовы, я не могу избежать загрузки данных с сервера.

Мои возвращенные заголовки выглядят так (подтверждено firebug):

Transfer-Encoding: chunked
Date: Wed, 05 Aug 2009 02:55:39 GMT
Content-Type: text/plain; charset=ISO-8859-1
Expires: Wed, 05 Aug 2009 03:55:39 GMT
Cache-Control: max-age=3600

Однако немедленное обновление страницы приводит к тому, что идентичные запросы попадают на сервер.

Я видел несколько сообщений о том, как избежать кеширования, а это не то, что мне нужно. Я видел несколько сообщений об использовании кэширования, но все они, кажется, полагаются после сохранения данных в DOM. Я хочу что-то, что ведет себя так же, как кэшированные изображения во время перезагрузки страницы.

Может ли браузер просто извлечь его из собственного кэша?

- x - x - x - x ОБНОВЛЕНИЕ --x - x - x -

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

Стабберн до отказа, я попробовал следующее:

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

В начале следующего запроса я просто проверяю, присутствует ли в запросе заголовок If-None-Match. Если это так, то браузер не кэширует запрос так, как я хотел, поэтому я отправил ответ 304 Not Modified.

Тестирование показывает, что Firefox не будет кэшировать мой запрос (но я все еще могу избежать части «извлечь дорогие данные» моего cgi), в то время как IE6 фактически кеширует его (и даже не будет пытаться получить обратно с сервера).

Это не очень хороший ответ, но сейчас он работает для меня
(эти вредные полностраничные обновления графических данных теперь не будут такими медленными или дорогими). ​​

(Что? Я использую IE6! Боже! О, смотри, белка!)

Ответы [ 5 ]

13 голосов
/ 18 августа 2009

Ajax-кэширование возможно и предсказуемо (по крайней мере, в IE и Firefox).

В этом посте обсуждается кеширование Ajax и имеется демонстрационная веб-страница:

http://blog.httpwatch.com/2009/08/07/ajax-caching-two-important-facts/

Есть также продолжение Стивом Соудерсом по вопросу F5:

http://stevesouders.com/tests/ajax_caching.php

1 голос
/ 05 августа 2009

Короткий ответ - нет. К сожалению, браузеры не надежно кэшируют AJAX-запросы так же, как они делают «обычные» страницы. (Хотя данные могут на самом деле быть кэшированными, браузер часто не использует кэш при обработке запросов AJAX так, как вы ожидаете.) Это должно измениться в будущем, но сейчас вам нужно обойти это.

1 голос
/ 05 августа 2009

Вы можете проверить свои ресурсы, используя Resource Expert Droid , чтобы убедиться, что они делают то, что вы намереваетесь. Вам также следует запустить трассировку сети, чтобы дважды проверить заголовки запросов и ответов, используя что-то вроде Wireshark , в случае, если Firebug не рассказывает всю историю.

Вполне возможно, что jQuery включает некоторые заголовки запросов так, что браузер решает, что они должны обходить кеш. Вы пробовали простой XMLHTTPRequest без рамки?

0 голосов
/ 06 октября 2011

Нашел соответствующую ссылку здесь после того, как автор заявил, что кэши браузера ajax действительно надежны.

претензия найдена здесь: http://davidwalsh.name/cache-ajax

ссылка здесь: http://ajaxref.com/ch6/builtincache.html

0 голосов
/ 05 августа 2009

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

Браузер не будет знать, были ли данные изменены или нет, так как json действительно получал динамически, а то, что находится в кеше, статично. Я думаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...