Предотвратить кэширование IE

Я разрабатываю веб-приложение Java EE с использованием Struts. Проблема связана с кэшированием Internet Explorer. Если пользователь выходит из системы, он может получить доступ к некоторым страницам, потому что они кэшируются, и запрос не делается. Если я нажму обновить, он работает нормально. Кроме того, если пользователь снова переходит на страницу входа, он не будет перенаправлять его, потому что эта страница также кэшируется.

Мне приходят на ум два решения:

  1. Написание перехватчика (например, фильтра сервлета) для добавления к заголовку ответа без кеша и т. д.
  2. Или или поставить теги <meta> на каждой странице.

Какой из них я должен сделать?


person GorillaApe    schedule 17.05.2010    source источник
comment
Какую версию Struts вы используете?   -  person laz    schedule 17.05.2010
comment
Я обнаружил, что добавление заголовков без кеша не всегда работает в IE.   -  person ziggy    schedule 23.10.2010
comment
Видимо вы забыли заголовок Expires. Смотрите также ответы на этот вопрос.   -  person BalusC    schedule 23.10.2010
comment
@ziggy так какое решение для этого?   -  person Thinker    schedule 04.01.2013


Ответы (5)


Вместо этого установите следующие заголовки на HttpServletResponse рассматриваемых страниц, чтобы вам не нужно было вручную копировать их на все страницы:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.

Это эквивалентно установке следующих метазаголовков на страницах вручную:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

Также см. этот ответ. Не забудьте очистить кеш браузера перед тестированием ;)

person BalusC    schedule 17.05.2010

Я обнаружил, что следующее работает хорошо:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform, pre-check=0, post-check=0, private");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);

Судя по тегам этого вопроса, вы используете Struts. Struts 1.x позволяет сделать это с помощью конфигурации в файле struts-config.xml, установив nocache="true" в элементе controller:

<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor" nocache="true" />

руководство по кэшированию от Марка Ноттингема — лучший ресурс, который я видел в Интернете. о HTTP и кэшировании, если вы хотите узнать больше.

При этом, в зависимости от проблемы, которую вы видите, это может быть проблема с историей браузера. См. здесь для получения дополнительной информации об этом.

person laz    schedule 17.05.2010
comment
Кстати: достаточно только первых трех свойств Cache-Control, как показано в вашем примере, они (и заголовок Expires) уже неявно устанавливают для последующих свойств желаемые значения. - person BalusC; 17.05.2010
comment
Мы пришли к этим значениям, исследуя проблему, из-за которой пользователи Opera могли просматривать защищенные страницы в истории своего браузера после выхода из системы и уничтожения своего сеанса. Это значение использовалось в качестве исправления. Я пытаюсь найти исходную ссылку, которая объясняет, как были получены эти настройки, но пока мне это не удалось. Возможно, это излишне, учитывая, что я узнал о различиях между кешем браузера и историей браузера только после этого исследования. - person laz; 17.05.2010
comment
Действительно, была связанная ошибка Opera 8.x, которая была исправлена ​​в середине предыдущего десятилетия. Также в этом браузере некорректно выполнялось кеширование редиректа. Но сегодня Opera 8 практически никто не использует. - person BalusC; 17.05.2010

Похоже, что IE ‹ 9 все равно будет кешировать, даже если у вас есть прагма: без кеша в голове и настроить браузер на обновление при каждой загрузке страницы. Вам нужно снова добавить метатеги во второй раздел заголовка перед закрытием html. Это прямо из самого MS.

http://support.microsoft.com/kb/222064/

немного лучшее объяснение здесь

http://www.htmlgoodies.com/beyond/reference/article.php/3472881/So-You-Dont-Want-To-Cache-Huh.htm

Из тестирования вам также понадобится метатег Expires: -1, чтобы он работал. Рекомендуется использовать Expires: -1, а не 0.

person Andy N    schedule 30.01.2012

Добавьте тег type="button" в фактическую кнопку действия.

Значение атрибута type по умолчанию зависит от текущего режима совместимости документа. Значение по умолчанию — отправить. В других режимах совместимости значением по умолчанию является кнопка. Когда элемент BUTTON отправляется в форму, значение зависит от текущего режима совместимости документа. Windows Internet Explorer 8 и выше. Значение атрибута type по умолчанию зависит от текущего режима совместимости документа. В стандартном режиме IE8 значением по умолчанию является submit. В других режимах совместимости и более ранних версиях Windows Internet Explorer значением по умолчанию является кнопка. Internet Explorer 8 и выше. Когда элемент BUTTON отправляется в форму, значение зависит от текущего режима совместимости документа. В режиме IE8 передается атрибут value. В других режимах документа и более ранних версиях Internet Explorer передается значение innerText.

http://msdn.microsoft.com/en-us/library/ie/ms535211(v=vs.85).aspx

person Alex.Zhe.Han    schedule 21.10.2013

Измените заголовки без кеша и т. д. Это обычный способ.

person Femaref    schedule 17.05.2010
comment
Так что лучше написать перехватчик... Не могли бы вы сказать мне, какие заголовки добавить? Потому что я вижу несколько заголовков, которые нужно поставить - person GorillaApe; 17.05.2010