2014-09-25 2 views
2

Я настраиваю компонент фильтра для вставки заголовков управления кешем. Это работает нормально, за исключением того, что в какой-то момент после фильтра вставляются дополнительные заголовки управления кешем.Spring Boot - Duplicate Headers

Я использую весенний ботинок.

Любые идеи о том, что может быть причиной проблемы?

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

ОКАЗЫВАЕТСЯ Spring Security добавляет их по умолчанию при использовании конфигурации Java. Вот как они могут быть отключены:

@EnableWebSecurity 
@Configuration 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

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

Вместо того, чтобы отключить все заголовки Spring Security, вы можете сократить их, так что вы все равно получите другие заголовки в то время как подключая свои собственные элементы управления кешем. Подробнее см. Http://docs.spring.io/spring-security/site/docs/3.2.5/reference/htmlsingle/#default-security-headers. – gregturn

+0

Ссылка на весенние документы больше не работает. Я думаю, что сейчас это хорошо: http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#default-security-headers –

+0

Это решение отключает все заголовки от Spring Security , –

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); 
    } 

    // ... 
}