Остановить кеширование сценариев браузера в приложении GWT
У меня есть приложение GWT, развернутое на наших клиентских машинах. Как продолжающийся
наряду с этим мы должны выпустить новые улучшенные версии
время от времени. Каждый раз, когда мы выпускаем новую версию, мы
часто сталкиваются с проблемой, когда клиентский браузер кэшировал
старые сценарии скриптов, и какое-то время он ведет себя странно, как данные
пытается работать с не совсем совместимо с ним. Что это
лучший способ преодолеть эту проблему. В настоящее время я должен сказать пользователям
очистить кеш браузера для новой версии, но было бы неплохо
им не нужно это делать.
Ответы
Ответ 1
По умолчанию основная часть вашего приложения должна быть кэширована браузером до тех пор, пока новая версия не будет создана вашим процессом сборки.
Это может помочь понять модель самозагрузки GWT, чтобы понять, как это работает.
Первый script ваш клиентский запрос your-app-name.nocache.js
не кэшируется и ничего не делает, кроме проверки пользовательского агента и возможностей браузера, и делает второй запрос для соответствующего приложения JS.
В этот момент запрос script должен быть кэширован браузером, если он был запрошен раньше. Это файл {indistinguisable-numbers-and-letters}.cache.html
.
При повторном развертывании вашего приложения будет выполнен файл nocache.js
и попросит с сервера другой файл cache.html
, который еще не будет присутствовать в кеше, но который будет кэшироваться браузером, как только он загружается.
Вы делаете что-то необычное с отложенным привязкой или с кешированием заголовков на вашем сервере? Возможно, это может привести к тому, что ваш файл nocache.js
получит кэширование в конце концов, что заставит его запросить старый cache.html
из кеша браузера.
Ответ 2
Возможное решение зависит от способа размещения вашего приложения. Если вы размещаете непосредственно из контейнера сервлета, вы можете использовать фильтр сервлетов, как описано здесь:
http://seewah.blogspot.com/2009/02/gwt-tips-2-nocachejs-getting-cached-in.html
Вот соответствующие фильтры из библиотеки tadedon:
http://code.google.com/p/tadedon/source/browse/tadedon-servlet/src/main/java/com/xemantic/tadedon/servlet/CacheDisablingFilter.java
http://code.google.com/p/tadedon/source/browse/tadedon-servlet/src/main/java/com/xemantic/tadedon/servlet/CacheForcingFilter.java
И вот здесь находится guice ServletModule, который позволяет использовать их для всего веб-приложения guice:
http://code.google.com/p/tadedon/source/browse/tadedon-gwt/src/main/java/com/xemantic/tadedon/gwt/http/GwtHttpCachingModule.java
Если вы используете какой-то обратный прокси-сервер перед tomcat, это будет еще проще. В случае apache (например, mod_proxy, mod_jk) и при условии, что все ресурсы приложения (html, графика, java-скрипты, css и т.д.) Помещаются на apache, просто установите эти параметры в конфигурации apache:
<Files *.nocache.*>
ExpiresDefault "access"
</Files>
<Files *.cache.*>
ExpiresDefault "now plus 1 year"
</Files>
Здесь описано:
http://code.google.com/webtoolkit/doc/latest/DevGuideCompilingAndDebugging.html
в разделе "Perfect Caching". Такой сценарий развертывания предполагает, что только обратные прокси-серверы должны обращаться к tomcat. Если по каким-либо причинам весь контекст приложения проксирован в tomcat, вы можете использовать директиву apache LocationMatch
вместо директивы Files
.