Подтвердить что ты не робот

Как определить, попало ли XMLHTTPRequest в кеш браузера

Если можно сказать (в рамках выполнения javascript), если GET XMLHTTPRequest попадает в кеш браузера, а не получает его ответ от сервера?

4b9b3361

Ответ 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 уверенно делает жизнь легкой.:)