Как добавить заголовок 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-->
- отключить spring security для статических ресурсов
- включить статическую обработку кэша ресурсов
в текущей версии 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=
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