Клапан Tomcat принудительно использует определенные заголовки Cache-Control

Я хочу правильно установить заголовки Cache-Control и ETag в своих ответах. Для этого я отключил кеширование запросов через конфигурацию безопасности Spring:

httpSecurity.headers().cacheControl().disable();

Затем при возврате ответа:

ResponseEntity.ok()
        .header("Cache-Control", "max-age=60")
        .header("ETag", "my-tag")
        .build()

Кажется, это работает в том смысле, что заголовки управления кешем безопасности spring по умолчанию не возвращаются (по умолчанию я думаю, что они возвращают «без кеша, без хранилища, max-age = 0, must-revalidate»), и мои заголовки присутствует в ответе. Однако там есть и кое-что еще:

Cache-Control: private
Expires: Thu, 01 Jan 1970 00:00:00 GMT
ETag: "0.42.1-20181213080300000"
Cache-Control: max-age=60
...other headers

Нижние заголовки кеша принадлежат мне, а верхние нежелательны. Кажется, они исходят от org.apache.catalina.authenticator.AuthenticatorBase, который, кажется, является частью используемого встроенного Tomcat. Мне не удалось найти способ получить доступ и изменить конфигурацию этого конкретного класса.

Посоветуйте, пожалуйста, как избавиться от нежелательных заголовков.

Я использую Spring Boot 1.5.18.RELEASE


person Tarmo    schedule 17.12.2018    source источник


Ответы (1)


Чтобы внести изменения в конфигурацию Valve, мне пришлось искать ее в контексте соответствующей фазы жизненного цикла с помощью EmbeddedServletContainerCustomizer, как показано ниже.

@Component
public class TomcatCacheControlCustomizer implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        if(container instanceof TomcatEmbeddedServletContainerFactory){
            TomcatEmbeddedServletContainerFactory containerFactory = (TomcatEmbeddedServletContainerFactory) container;
            containerFactory.addContextLifecycleListeners((LifecycleListener) event -> {
                Context context = (Context) event.getLifecycle();
                if(event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)){
                    if(context.getPipeline() != null){
                        Pipeline pipeline = context.getPipeline();
                        if(pipeline.getValves() != null){
                            Optional<Valve> authenticatorBase = Arrays.stream(pipeline.getValves()).filter(v -> v instanceof AuthenticatorBase).findFirst();
                            if(authenticatorBase.isPresent()){
                                ((AuthenticatorBase) authenticatorBase.get()).setDisableProxyCaching(false);
                            }
                        }
                    }
                }
            });
        }
    }

}

После обновления конфигурации AuthenticatorBase нежелательные заголовки Cache-Control больше не добавлялись в ответы, и остались только мои пользовательские заголовки.

person Tarmo    schedule 18.12.2018