Я работаю над приложением Java / Struts, которое использует Tomcat 6.0.10. Это типичное веб-приложение, которое позволяет пользователям редактировать некоторые формы и транслировать PDF-файлы. Путь назад мы добавили:
<security-constraint>
<web-resource-collection>
<web-resource-name>GeneralRequests</web-resource-name>
<url-pattern>/WR1/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
Так что любая из не потоковых страниц принудительно помещается в https И не кэшируется (мы думали). В системе есть отдельная запись ограничения для потоковых страниц.
В недавних тестах на IE6 мы обнаружили, что «иногда» страницы кэшируются, хотя мы еще не полностью определили, когда. Помимо флага КОНФИДЕНЦИАЛЬНО, мы также имели:
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
response.setDateHeader("Expires", 1);
Но мы удалили их, потому что это, казалось, вызывало уродливые повторные публикации предупреждений в IE6, и мы подумали, что КОНФИДЕНЦИАЛЬНАЯ транспортная гарантия также включала в себя всю необходимую механику для предотвращения кэширования страницы браузером. Мы бы предпочли, чтобы проблема оставалась на усмотрение Tomcat.
Каков «правильный» способ сделать это, чтобы у нас не было (столько) проблем в будущем?
Наши проблемы с кэшированием вызваны определенной ошибкой в IE6? Или просто определенный набор релизов? Это позволяет случиться в 7 и / или 8?
ОБНОВЛЕНИЕ: Мы проверили, и Tomcat правильно отправляет параметры Pragma, Cache-Control и Expires, так что это не проблема (ну, значения no-string и max-age не отправлено, но все равно не проблема).
Проблема оказалась в Apache Portable Runtime (APR) 1.1.8. Каким-то образом, хотя мы не совсем уверены, почему, он создает повторяющиеся действия браузера из одного запроса. Для нас это выглядело так, как если бы страница была кэширована, поскольку содержала недопустимый токен транзакции Struts, но на самом деле вторая исполняющая версия того же запроса (с неверным идентификатором сеанса) перезаписывала токен исходного запроса в сеансе. Обновление до 1.1.16 решило проблему.
Почему некоторые запросы дублируются (но с разными идентификаторами сеансов), все еще остается загадкой ...
Paul.