Добавить ShallowEtagHeaderFilter в Spring Boot MVC

Я пытаюсь настроить конфигурацию своего приложения, чтобы настроить поддержку ETag.

Я только что проверил этот ТАК вопрос, поэтому позвольте мне сказать, где мой код отличается от него:

  1. Я вообще не использую какой-либо файл конфигурации xml.
  2. Я использую разные классы конфигурации для каждого аспекта системы. Мой WebConfig выглядит так:

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = { "xxx", "yyy" })
public class WebConfig extends WebMvcConfigurerAdapter {

   @Bean
   public Filter shallowETagHeaderFilter() {
        return new ShallowEtagHeaderFilter();
   }
      ...
}

  1. И мой SecurityConfig выглядит так:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        ...

        @Override
        protected void configure(final HttpSecurity http) throws Exception {
            http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().exceptionHandling()
                        .authenticationEntryPoint(authenticationEntryPoint())
                .and().authorizeRequests()
                        .antMatchers(HttpMethod.GET, "/**").authenticated()
                        .antMatchers(HttpMethod.POST, "/**").authenticated()
                        .antMatchers(HttpMethod.HEAD, "/**").authenticated()
            .and().csrf().disable()    
            .addFilterBefore(authenticationTokenProcessingFilter(), UsernamePasswordAuthenticationFilter.class);
        }

    }

  1. У меня также есть класс инициализатора, который пуст:

    @Order(value=1)
    public class SecurityWebAppInitializer extends AbstractSecurityWebApplicationInitializer {

    }

Я нигде не вижу, чтобы ShallowEtagHeaderFilter было добавлено в цепочку по умолчанию или что-то в этом роде, как я могу использовать его в этой настройке?


person resilva87    schedule 04.11.2014    source источник
comment
А ваша проблема/вопрос? Spring Boot должен добавить фильтр автоматически. Ваш инициализатор не используется, поэтому он ничего не делает и ничего не добавляет. Spring Security уже включен Spring Boot, поэтому ваш @EnableWebSecurity не нужен.   -  person M. Deinum    schedule 05.11.2014
comment
Ну, в данном случае он не настраивается автоматически. Как я могу изменить свой инициализатор, чтобы запустить ShallowEtagHeaderFilter?   -  person resilva87    schedule 05.11.2014
comment
Вы не можете, поскольку инициализатор ничего не делает в приложении Spring Boot.   -  person M. Deinum    schedule 05.11.2014
comment
Я действительно не слежу. Так что я не должен использовать инициализатор?   -  person resilva87    schedule 05.11.2014
comment
Вы читали документацию Spring Boot и смотрели примеры? Он создает исполняемый jar/war или нуждается в пользовательском инициализаторе, если вы хотите развернуть его как war вместо исполняемого файла jar.   -  person M. Deinum    schedule 05.11.2014
comment
Прочтите все еще раз (spring.io/guides/gs/securing-web), не могу разобраться. У меня есть исполняемый jar. Сделал свою конфигурацию так же, как показано в посте, но все еще не могу использовать этот фильтр.   -  person resilva87    schedule 05.11.2014


Ответы (1)


Хорошо,

Согласно этому сообщение:

[...] Чтобы смягчить это, Spring Security добавила поддержку управления кешем, которая будет вставлять в ваш ответ следующие заголовки.

Cache-Control: без кеша, без хранения, max-age=0, обязательна повторная проверка

Прагма: без кеша

Истекает: 0

Итак, произошло то, что поддержка ETag была добавлена, но Spring Security аннулировала ее в ответе. Кажется, что если вы хотите использовать как Spring Security, так и поддержку ETag, вам нужно объявить следующую строку кода (выделено стрелкой):

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ...

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().exceptionHandling()
                    .authenticationEntryPoint(authenticationEntryPoint())
            .and().authorizeRequests()
                    .antMatchers(HttpMethod.GET, "/**").authenticated()
                    .antMatchers(HttpMethod.POST, "/**").authenticated()
                    .antMatchers(HttpMethod.HEAD, "/**").authenticated()
        .and().csrf().disable()    
        .addFilterBefore(authenticationTokenProcessingFilter(), UsernamePasswordAuthenticationFilter.class);
        ===> http.headers().cacheControl().disable();
    }

}
person resilva87    schedule 05.11.2014