Согласование содержимого игнорируется при использовании кнопки Возврата браузера

StackOverflow https://stackoverflow.com/questions/1465974

Вопрос

Вот такая ситуация:

У меня есть веб-приложение, которое отвечает на запрос списка ресурсов, скажем:

/items

Первоначально это запрашивается непосредственно веб-браузером путем перехода по этому пути.Браузер использует стандартный заголовок "Accept", который включает "text / html", и мое приложение замечает это и возвращает HTML-содержимое для списка элементов.

Внутри возвращаемого HTML находится некоторый JavaScript (jQuery), который затем выполняет ajax-запрос для извлечения фактических данных:

/items

Только на этот раз заголовку "Accept" явно присвоено значение "application/json".Опять же, мое приложение замечает это, и JSON корректно возвращается в запрос, данные вставляются на страницу, и все устраивает.

Вот тут-то и возникает проблема:Пользователь переходит на другую страницу, а затем нажимает кнопку "НАЗАД".Затем им будет предложено сохранить файл.Это, оказывается, тот самый JSON данные из списка товаров.

Пока что я подтвердил, что это происходит как в Google Chrome, так и в Firefox 3.5.

Здесь есть два возможных типа ответов:

  1. Как я могу исправить эту проблему?Есть ли какая-то волшебная комбинация Заголовков Cache-Control или других voodoo, которые заставляют браузер делать правильные вещи здесь?

  2. Если вы думаете, что я делаю что-то здесь ужасно неправильно, как мне поступить по этому поводу?Я стремлюсь к корректности, но также пытаюсь не жертвовать гибкостью.

Если это поможет, приложение представляет собой веб-приложение JAX-RS, использующее Restlet 2.0 m4.Я могу предоставить примеры заголовков запросов / ответов, если это полезно, но я считаю, что проблема полностью воспроизводима.

Это было полезно?

Решение

Есть ли какая-то волшебная комбинация заголовков Cache-Control или другого вуду, которые заставляют браузер поступать здесь правильно?

Если вы отправляете разные ответы на разные запросы, примите:заголовки, вы должны включить заголовок:

Vary: Accept

в вашем ответе.В Варьироваться заголовок также должен содержать любые другие заголовки запроса, которые влияют на ответ, так что, например, если вы выполняете сжатие gzip / deflate, вам придется включить Accept-Encoding .

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

Если вы считаете, что я делаю здесь что-то ужасно неправильное, как мне следует поступить по этому поводу?

Я не думаю, что идея предоставления разного контента для разных типов по одному и тому же URL-адресу ужасно ошибочна, но вы позволяете себе больше проблем с совместимостью, чем вам действительно нужно.Полагаться на заголовки, работающие через JSON, на практике не очень хорошая идея;вам было бы лучше всего просто указать другой URL, например /items/json или /items?format=json.

Другие советы

Я знаю, что этот вопрос устарел, но на всякий случай, если кто-нибудь еще столкнется с этим:

У меня была такая же проблема с приложением Rails, использующим jQuery, и я исправил ее, указав браузеру не кэшировать ответ JSON с решением, приведенным здесь для другого вопроса:

jQuery $.getJSON работает только один раз для каждого элемента управления.Снова не доходит до сервера

Казалось, проблема возникла только с Chrome и Firefox.Safari нормально справлялся с обратным поведением, не требуя явно указывать ему не кэшировать.

Старый вопрос, но для всех, кто еще видит это, нет ничего плохого в том, что спрашивающий использует заголовок Accept .

Это подтвержденная ошибка в Chrome.(Ранее также в Firefox, но с тех пор исправлено.)

http://code.google.com/p/chromium/issues/detail?id=94369

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top