如何使用Spring缓存控制删除Expires头

时间:2016-03-15 12:22:02

标签: java spring http spring-mvc spring-security

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不会删除它?

2 个答案:

答案 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