Spring Security默认添加以下缓存标头:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
这对我们的HTML网页来说是一个很好的设置。对于静态资源(图像,CSS等),我们希望将它们缓存。根据{{3}},它可以像这样配置:
@EnableWebMvc
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/")
.setCachePeriod(31556926);
}
}
这导致以下HTTP标头:
Cache-Control: max-age=604800
Pragma:
Expires: 0
除了Expires
标题之外,它仍然很好,它仍然表示不应该缓存文档。 (标准说max-age
优先于Expires
。但我们的中间缓存仍将其视为不可缓存。)
我们如何删除可缓存文档的Expires
标题(或将其设置为空白)?如果我们配置缓存周期,为什么Spring不会删除它?
答案 0 :(得分:1)
这似乎与spring-security#3759有关。您可以通过忽略(有些不相关的)SPR-14005上列出的特定URL来解决此问题。但是,建议不要这样做(即使URL指向静态资源),因为这意味着对URL禁用了所有安全性。
相反,用户应考虑使用此解决方法:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
RequestMatcher notResourcesMatcher = new NegatedRequestMatcher(new AntPathRequestMatcher("/resources/**"));
HeaderWriter notResourcesHeaderWriter = new DelegatingRequestMatcherHeaderWriter(notResourcesMatcher , new CacheControlHeadersWriter());
http
.headers()
.cacheControl().disable()
.addHeaderWriter(notResourcesHeaderWriter);
}
}
当Spring Security 4.1发布时,spring-security#3759将被修复,这应该不是问题。
答案 1 :(得分:0)
将<Sellers>
设为ResourceHttpRequestHandler.useExpriresHeader
。
不幸的是,配置对象false
中没有这样的标志。所以你需要自己做:
以下只是一个想法,我没有检查此方法不配置任何其他ResourceHandlerRegistry
而不是HandlerMapping
ResourceHttpRequestHandler