как выборочно отключить кеш для весенней загрузки (manifest.appcache)

Из этого вопроса видно, что Spring Security управляет кешем для весенней загрузки. Из весенней загрузки документации он показывает, как установить кеш для ресурсов, используя:

spring.resources.cache-period= # cache timeouts in headers sent to browser

cache-period отлично подходит для всех предопределенных статических местоположений для весенней загрузки (т.е. /css**, /js/**, /images/**), но я также создаю manifest.appcache для автономной загрузки моих статических ресурсов и из-за всех вышеперечисленных весенних безопасности / загрузки отправляет обратно заголовки кеша с манифестом.appcache

"method": "GET",
"path": "/manifest.appcache",
"response": {
    "X-Application-Context": "application:local,flyway,oracle,kerberos:8080",
    "Expires": "Tue, 06 Oct 2015 16:59:39 GMT",
    "Cache-Control": "max-age=31556926, must-revalidate",
    "status": "304"
}

Я хотел бы знать, как добавить исключение для manifest.appcache. IE и Chrome, кажется, «делают правильные вещи» с appcache независимо от моих заголовков, но FF, кажется, немного более своеобразен, отмечая, когда appcache изменился, и я думаю, что мои заголовки кеша его портят.

РЕДАКТИРОВАТЬ: я должен добавить из источника для WebMvcAutoConfiguration показывает, как настроен кеш для ресурсов, я просто не уверен, как выборочно отключить для моего 1 случая с о потенциально нарушить остальную часть того, что весенняя загрузка устанавливает в этом файле.

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        if (!this.resourceProperties.isAddMappings()) {
            logger.debug("Default resource handling disabled");
            return;
        }

        Integer cachePeriod = this.resourceProperties.getCachePeriod();
        if (!registry.hasMappingForPattern("/webjars/**")) {
            registry.addResourceHandler("/webjars/**")
                    .addResourceLocations("classpath:/META-INF/resources/webjars/")
                    .setCachePeriod(cachePeriod);
        }
        if (!registry.hasMappingForPattern("/**")) {
            registry.addResourceHandler("/**")
                    .addResourceLocations(RESOURCE_LOCATIONS)
                    .setCachePeriod(cachePeriod);
        }
    }

person JimB    schedule 06.10.2014    source источник
comment
Простое добавление класса, расширяющего WebMvcConfigurerAdapter, и добавление определенного правила для этого ресурса должно помочь.   -  person M. Deinum    schedule 06.10.2014
comment
Я пробовал это: @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { super.addResourceHandlers(registry); registry.addResourceHandler("/manifest.appcache").addResourceLocations("/").setCachePeriod(0); } но я получаю 404.   -  person JimB    schedule 08.10.2014
comment
Использование / заставит его попытаться получить данные из корня веб-приложения. Убедитесь, что / закрывает правильное физическое расположение файла.   -  person M. Deinum    schedule 08.10.2014
comment
мой manifest.appcache находится в корневом каталоге приложения (в данном случае /public, который находится в том же месте, что и index.html.   -  person JimB    schedule 08.10.2014
comment
Тогда это должно быть /public, а не /.   -  person M. Deinum    schedule 09.10.2014


Ответы (3)


Спасибо за вопрос и ответ!

У нас были похожие проблемы: все браузеры (Chrome, Safari, IE), кроме одного (FF), сами не кэшировали файлы манифеста, а перезагружали их после изменения.

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

Мое решение состоит из двух частей:

  1. Предоставьте комментарий «rev» в файле манифеста. Хотя это и не входит в спецификацию W3C, некоторые браузеры, похоже, хотят, чтобы комментарий был похож на это для обнаружения изменений в манифесте или ссылочных (кешированных) файлах:

    # rev 7
    

    Теперь мы изменим параметр «rev» в файле манифеста кеша с помощью сгенерированного Maven уникального номера сборки: //github.com/dukecon/dukecon_html5/commit/b60298f0b856a7e54c97620f278982142e3e1f45).

  2. Отключите кеширование, предоставив фильтр, который добавляет заголовок «Cache-Control: no-cache» точно к шаблону файла cache.manifest: ="nofollow">https://github.com/dukecon/dukecon_server/commit/dc02f26996cb172df804da007546f439df75126d
person Gerd Aschemann    schedule 21.09.2015
comment
солидный ответ, спасибо. для вашего первого пункта это не rev, который что-то меняет, браузер просматривает комментарии и хэширует их. если он обнаруживает изменение в хеше, он делает кеш недействительным и перезагружается. для вашего второго пункта это определенно предпочтительное решение, поскольку оно нацелено исключительно на кэш приложений и не мешает другим периодам кеша. я отмечу ваш ответ как предпочтительный. - person JimB; 22.09.2015

На основе этот ответ с подробным описанием IE, требующего "max-age=1, must-revalidate" , и путем тестирования во всех браузерах, установив для свойства значение

spring.resources.cache-period=1

позволит написать правильные заголовки http, которые позволят правильно обрабатывать манифест appcache. это не то решение, на которое я надеялся (я хотел иметь период кэширования 0 с правильными заголовками), но оно заставляет браузер работать правильно и правильно использовать манифест appcache.

Опять же, чтобы обобщить контекст решения - это для моего приложения, которое загружает все мои ресурсы в автономном режиме (js/css/html) и обслуживает из кэша приложений.

person JimB    schedule 19.02.2015

В текущей версии (февраль 2016 г.) нет необходимости что-то делать в коде, чтобы изменить поведение по умолчанию. Просто выполните некоторую настройку в своем application.properties:

# Enable HTML5 application cache manifest rewriting.
spring.resources.chain.html-application-cache=true

# Enable the Spring Resource Handling chain. Disabled by default unless at least one strategy has been enabled.
spring.resources.chain.enabled=true
# Enable the content Version Strategy.
spring.resources.chain.strategy.content.enabled=true 
# Comma-separated list of patterns to apply to the Version Strategy.
spring.resources.chain.strategy.content.paths=/** 

# Locations of static resources.
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

Это все. Теперь Spring будет проверять, были ли изменены ваши статические файлы, и может отправлять более разумные ответы (If-Modiffied-Since и другие), а также перезаписывать ваш кэш приложений.

Кроме того, если есть причины не использовать версию на основе контента для некоторых ресурсов, вы можете использовать альтернативную стратегию FixedVersion и указать версию явно в своей конфигурации:

#Enable the fixed Version Strategy.
spring.resources.chain.strategy.fixed.enabled=false 
# Comma-separated list of patterns to apply to the Version Strategy.
spring.resources.chain.strategy.fixed.paths= 
# Version string to use for the Version Strategy.
spring.resources.chain.strategy.fixed.version= 

P.S. Не забывайте про Spring Security: он переписывает заголовки кеша и отключает кеширование.

Подробнее см. в документах.

person Alexandr Latushkin    schedule 25.02.2016
comment
Не забудьте добавить spring.resources.cache-period=3600 со временем истечения в секундах. - person Thiago Pereira; 08.08.2016
comment
добавил ответ здесь. страницы теперь не загружаются. - person Stealth Rabbi; 21.03.2018