Если можно сказать (в рамках выполнения javascript), если GET XMLHTTPRequest попадает в кеш браузера, а не получает его ответ от сервера?
Как определить, попало ли XMLHTTPRequest в кеш браузера
Ответ 1
Из Спецификация XMLHttpRequest:
Для 304 Не измененных ответов, которые являются результатом действия агента пользователя генерируемый условный запрос, пользовательский агент должен действовать так, как если бы сервер дал ответ 200 OK с соответствующим контентом.
Другими словами, браузер всегда будет указывать код состояния 200 OK, даже для запросов, попадающих в кеш браузера.
Однако спецификация также говорит:
Пользовательский агент должен разрешать заголовкам запросов автора переопределять автоматический кеш валидация (например, If-None-Match или If-Modified-Since), и в этом случае 304 Не модифицированные ответы должны быть пройдены.
Итак, есть временное решение, чтобы сделать ответы 304 Not Modified видимыми для вашего кода JavaScript.
Ответ 2
При выполнении запроса ajax вы получаете код ответа
if (request.readyState == 4) {
if (request.status == 200) { // this number.
...
статус 200 означает, что вы получаете новую копию данных:
Запрос преуспел. Информация, возвращаемая с ответом, зависит от метода, используемого в запросе -
статус 304 означает, что данные не изменились, и вы получите их из кеша браузера:
Если клиент выполнил условный запрос GET и разрешен доступ, но документ не был изменен, сервер ДОЛЖЕН ответить на этот код состояния.
Update:
Вы можете добавить загрузчик кеша к URL-адресу, чтобы гарантировать, что вы всегда попадаете на сервер:
var ajaxUrl = "/path?cache="+(Math.random()*1000000);
Ответ 3
Этот ответ основан на предположении, что вы имеете в виду только кеш браузера, без участия 304 (измененный-так, etag и т.д.).
Проверьте, сколько времени прошло запрос, если он был разрешен из кеша, тогда он должен приблизиться к 0 мс.
Ответ 4
Из http://www.w3.org/TR/2012/WD-XMLHttpRequest-20121206/
Для 304 Не измененных ответов, которые являются результатом действия агента пользователя генерируемый условный запрос, пользовательский агент должен действовать так, как если бы сервер дал ответ 200 OK с соответствующим контентом. Пользовательский агент должен позволять заголовкам запросов автора переопределять автоматический кеш валидация (например, If-None-Match или If-Modified-Since), и в этом случае 304 Не допускаются изменения ответов. [HTTP]
Я нахожу это довольно расплывчатым. Мое предположение состояло бы в том, что если запрос будет запрошен с условием, вы увидите код ответа 304. Но, как я объяснил в другом комментарии (источник: https://developers.google.com/speed/docs/best-practices/caching), может даже не быть запрос, если последний HTTP-заголовок сервера ответа для этот ресурс установил Cache-Control: max-age
или Expires
как-то в будущем. В этом случае я не уверен, что должно произойти.
Ответ 5
Используете ли вы Firefox Firebug?
Firebug имеет панель "Net" с фильтрованным представлением "XHR". Вы должны иметь возможность проверять информацию о кеше с помощью строки фазы запроса, проверять состояние и/или щелкая треугольник, чтобы проверить "Заголовки".
кэшированный или не кэшированныйНе все сетевые запросы равны - некоторые из них загружаются из кеш браузера вместо сети. Firebug предоставляет коды состояния для каждого запроса, чтобы вы могли быстро просмотреть и посмотреть, насколько эффективно ваши сайт использует кеш для оптимизации времени загрузки страницы.
Firebug Документы Net Panel находятся здесь.
Chrome/Safari/Opera имеют похожие инструменты отладки. Просто нашел хороший список здесь (большинство из них должны иметь инструменты для проверки XHR).
EDIT:
Чтобы немного искупить себя...
Как ответил ibu, я также начал бы проверять код состояния ответа.
Если вы используете jQuery:
statusCode (добавлено 1.5)Карта По умолчанию: {} Карта числовых HTTP-кодов и функций, которые будут вызываться, когда ответ имеет соответствующий код. Например, следующее когда статус ответа равен 404:
$.ajax({ statusCode: { 404: function() { alert("page not found"); } } });
Если запрос выполнен успешно, функции кода статуса принимают одинаковые параметры как обратный вызов успеха; если это приводит к ошибке, они используйте те же параметры, что и обратный вызов ошибки.
jQuery уверенно делает жизнь легкой.:)