Веб-приложение на Java: принудительная загрузка браузером статического содержимого (js, css, html), если развернутый файл изменен

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

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

Я знаю, что мы также можем установить версию, когда объявляем файлы (что-то вроде ), но это вынуждает нас изменить весь наш код, чтобы включить заполнитель версии, и при этом Сценарии сборки, заменяющие его.

Есть ли более умный способ сделать это? Мы используем Spring MVC. Есть ли какая-либо опция в mvc:resources, о которой я не знаю, чтобы сделать это без изменения кода? Или что-то на web.xml?

Мы используем кота. Есть ли способ сделать это на уровне сервера? Поможет ли использовать кеш как Varnish или что-то в этом роде? Или эти кэши позволяют только установить время истечения срока действия и не проверять, что файл изменился? Имейте в виду, что мне совсем не удобно в задачах настройки сервера и кеша.

Я узнал об этом проекте https://code.google.com/p/modpagespeed/, но так как это далеко от моей зоны комфорта, я изо всех сил пытаюсь понять возможности и помогает ли это с тем, что я хочу.

У кого-нибудь есть идеи? Спасибо

2 ответа

Решение

Вы можете использовать версию в качестве параметра запроса, например /resources/foo.js?_version=1.0.0, Если вы используете Maven, получить информацию о версии не так сложно. /META-INF/maven/{groupId}/{artifactId}/pom.properties, Конечно, это приведет к перезагрузке всех сценариев с каждой новой версией... но новые версии, вероятно, не так часто развертываются.

Тогда всегда рекомендуется правильно устанавливать заголовки кэширования HTTP. <mvc:resources> должен правильно обращаться Last-Modified Заголовок для вас. И вы можете установитьcache-period чтобы браузер чаще проверял наличие изменений в ресурсах.

Вот рабочее решение: CorrectBrowserCacheHandlerFilter.java

По сути, когда ваш браузер запрашивает статические файлы, сервер перенаправляет все запросы на один и тот же, но с параметром запроса хеша (?v=azErT например) зависит от содержимого целевого статического файла.

Делая это, браузер никогда не будет кэшировать статические файлы, объявленные в вашем index.htmlнапример (потому что всегда будет получать 302 Moved Temporarily), но будет кэшировать только те, которые имеют хэш-версию (сервер ответит 200 для них). Таким образом, кэш браузера будет эффективно использоваться для тех статических файлов с хэш-версией.

Отказ от ответственности: я автор CorrectBrowserCacheHandlerFilter.java,

Другие вопросы по тегам