2012-02-25 2 views
6

Я использую HTML 5 историю api, чтобы сохранить состояние при выполнении запросов ajax, и я предоставляю полный контент html, если пользовательский запрос на ту же страницу без какого-либо запроса ajax.«Показать последнюю закрытую вкладку», чтобы показать последний контент запроса ajax

Функция «Восстановить последнюю закрытую вкладку» браузера приносит последний контент запроса ajax без попадания на сервер. Если браузер будет запрашивать без добавления последнего содержимого запроса, все будет работать без проблем. Но браузер просто показывает последний контент запроса ajax.

Я испытал это на Chrome 17, Firefox 10 (я не пробовал его на IE9, потому что он не имеет поддержки API истории)

Что хорошо известное решение этой проблемы?

Редактировать: Эти запросы ajax - это просто запрос «получить» на сервер.

Это действительно невозможно продемонстрировать в jsfiddle.net, потому что мало причин. Вы можете продемонстрировать это в своем локальном хосте, как показано ниже.

Сделайте запрос «получить» на сервер и вытащите объекты json, а затем нажмите этот URL-адрес в историю api, как показано ниже.

history.pushState(null,null,url); 

Затем закройте эту вкладку и нажмите «Восстановить последнюю закрытую вкладку» в вашем браузере. Что ты видишь ? Тело ответа Json? Браузер показывает это без запроса сервера, не так ли?

+0

Каждый имеет идея? – Freshblood

+1

Можете ли вы опубликовать какой-либо код или ссылку на страницу, которая демонстрирует проблему? – robertc

+0

@robertc Я обновил вопрос и предоставил информацию о демонстрации. – Freshblood

ответ

4

Проблема была вызвана заголовками ответов HTTP. Заголовки содержали кэшируемую информацию для запросов ajax, поэтому браузер показывал этот URL-адрес из кеша без попадания в базу данных.

После удаления параметров кэша из заголовков ответов браузер смог нанести удар по серверу, не доставляя содержимое из кеша.

0

Все зависит от того, какой браузер вы используете и какие оптимизации включены.

Google Chrome, например, сохранит страницу в памяти, поэтому, когда вы нажмете назад и перейдете на новый сайт, или когда вы снова откроете закрытую вкладку, это приведет к восстановлению страницы из памяти.

Старые/более медленные браузеры будут просто обновлять что-либо.

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

+0

Я использую последнюю версию Chrome и Firefox без изменения каких-либо параметров. не должен быть проблемой? Пользователь полностью видит последний контент запроса ajax, который является json. Я не могу показать ему последнее состояние страницы. Я использую sammy js для достижения этих целей. – Freshblood

1

Когда вы открываете закрытую вкладку, браузер может повторно использовать данные из кеша для заданного URL для заполнения окна. Поскольку данные в кеше от ответа на запрос ajax, это то, что он использует, и вы видите JSON.

Так что возникает вопрос: почему браузер не использовал HTML-код в кеше при выполнении запроса ajax? Браузеры используют разные правила, чтобы определить, следует ли использовать кешированный контент в зависимости от того, что они делают. В этом случае Chrome будет рад повторно использовать его при восстановлении закрытой вкладки, а не при выполнении запроса ajax.

Вы можете исправить это, сообщив обозревателю never кэшировать ответ. Желательно, зависит от вашего варианта использования.

Например, вставляя их в верхней части файла (после открытия <?php тега, конечно) делает это не произойдет, для меня:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 
Смежные вопросы