Как добавить заголовок Cache-Control в статический ресурс при весенней загрузке?

как я могу добавить Cache-Control HTTP-заголовок в весенней загрузке для статических ресурсов?

пробовал использовать фильтр-компонент в приложении, который правильно пишет заголовки, но Cache-Control заголовок перезаписывается.

@Component
public class CacheBustingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
                                              throws IOException, ServletException {

        HttpServletResponse httpResp = (HttpServletResponse) resp;
        httpResp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        httpResp.setHeader("This-Header-Is-Set", "no-cache, no-store, must-revalidate");
        httpResp.setHeader("Expires", "0");

        chain.doFilter(req, resp);
    }

что я получаю в браузере:

Cache-Control:no-store
This-Header-Is-Set:no-cache, no-store, must-revalidate
Expires:0

чего я хотел бы:

Cache-Control:no-cache, no-store, must-revalidate
This-Header-Is-Set:no-cache, no-store, must-revalidate
Expires:0

5 ответов


на документация, of ResourceHandlerRegistry. Это довольно просто. (У меня нет кода, связанного с этим прямо сейчас.)

в том месте, где вы настраиваете свои статические ресурсы, просто добавьте addResourceHandler метод, он возвращает ResourceHandlerRegistration "объект".

здесь вы можете использовать setCacheControl метод. Что вам нужно сделать, это настроить и установить CacheControl obejct.

это с весны 4.2, иначе вам придется сделать это, как показано ниже.

@Configuration
@EnableWebMvc
@ComponentScan("my.packages.here")
public class WebConfig extends WebMvcConfigurerAdapter {


   @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").setCachePeriod(0);
    }

}

это происходит из-за Безопасности Spring: он перезаписывает все заголовки кэша, чтобы полностью отключить кэширование. Поэтому нам нужно сделать две вещи:--4-->

  1. отключить spring security для статических ресурсов
  2. включить статическую обработку кэша ресурсов

в текущей версии Spring Boot мы можем изменить это поведение в приложении.конфигурация свойств.

отключить spring security для некоторых ресурсов:

# Comma-separated list of paths to exclude from the default secured 
security.ignored=/myAssets/**

включить отправку кэша заголовки для статических ресурсов:

# 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 и другие) и переписывать appcache.

кроме того, если есть причины не использовать контент-версию для некоторых ресурсов - вы можете использовать альтернативную стратегию 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= 

подробнее в docs


Maleenc, что ответ правильный. Однако в связи с этим возникает одна проблема.

следующий код предоставит правильный заголовок управления кэшем в первом запросе, но не будущий запрос, который возвращает 304 (не измененный), вернет заголовок управления кэшем по умолчанию, установленный spring security. {код}

public void addResourceHandlers(ResourceHandlerRegistry registry) {         
    registry.addResourceHandler("/resources/**").setCacheControl(CacheControl.maxAge(10, TimeUnit.SECONDS));
}

Я поднял этот вопрос перед весенней командой, см. https://jira.spring.io/browse/SPR-15133. Здесь был ответ: "Теперь вы не должны отключать заголовки управления кэшем безопасности для всего вашего приложения; правильный способ отключить их для определенного пути (обработка ресурсов, здесь) объясняется в комментарии к этой проблеме, см. раздел"обходной путь"."


используя spring boot 1.3.3, у меня был ответ 404, используя ответ maleenc. Я мог бы исправить это, добавив местоположение ресурса:

@Configuration
public class HttpClientConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").setCacheControl(CacheControl.maxAge(1, TimeUnit.DAYS))
                .addResourceLocations("/");
    }
}

свойства, которые управляют заголовками кэша по умолчанию для ресурсов:

spring.resources.cache.cachecontrol.max-age: 3600

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html