Клапан Tomcat форсирует определенные заголовки Cache-Control - PullRequest
0 голосов
/ 17 декабря 2018

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

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

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

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

Кажется, что работает в том смысле, что по умолчанию кэш безопасности SpringЗаголовки -control не возвращаются (по умолчанию я думаю, что они возвращают «no-cache, no-store, 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

1 Ответ

0 голосов
/ 18 декабря 2018

Чтобы внести изменения в конфигурацию 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 больше не добавлялись в ответы, и оставались только мои пользовательские заголовки.

...