Spring Boot - 重复标题

时间:2014-09-25 18:27:55

标签: java spring servlets spring-boot

我设置了一个过滤bean来插入缓存控制头。这工作正常,除了在过滤器之后的某个时刻,插入了额外的缓存控制头。

我正在使用Spring Boot。

关于可能导致问题的任何想法?

public class CacheControlFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        Calendar expires = Calendar.getInstance();
        expires.add(Calendar.HOUR, 24);

        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // Returns false
        System.out.println("==========> " + httpResponse.containsHeader("Cache-Control"));

        httpResponse.addHeader("Cache-Control", "max-age=" + (expires.getTimeInMillis() / 1000));
        httpResponse.addDateHeader("Expires", expires.getTimeInMillis());

        chain.doFilter(request, response);
    }
}

请参阅重复的缓存控制标头:

HTTP/1.1 200 OK
...
Cache-Control: max-age=1411755690
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: Fri, 26 Sep 2014 18:21:30 GMT
Expires: 0
Pragma: no-cache
Content-Type: image/png
...

2 个答案:

答案 0 :(得分:2)

原因是Spring Security在使用Java配置时默认添加它们。以下是他们如何被禁用:

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http
      // ...
        .headers().disable();
   }
}

答案 1 :(得分:1)

使用setHeader代替addHeader

Spring Security documentation说:

  

如果您确实想要缓存特定的响应,那么您的应用程序可以   有选择地调用HttpServletResponse.setHeader(String,String)   覆盖Spring Security设置的标头。这有助于确保   CSS,JavaScript和图像等内容都已正确缓存。

或者您可以使用以下命令指定需要不同缓存控制的URL:

@EnableWebMvc
public class WebMvcConfiguration implements WebMvcConfigurer {

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

    // ...
}