我想在我的回复中正确设置缓存控制和 ETag 标头。为此,我已通过 spring 安全配置禁用了请求缓存:
httpSecurity.headers().cacheControl().disable();
然后在返回响应时:
ResponseEntity.ok()
.header("Cache-Control", "max-age=60")
.header("ETag", "my-tag")
.build()
从某种意义上说,它似乎在不返回默认的 spring 安全缓存控制标头(默认情况下我认为它们返回"无缓存,无存储,max-age=0,必须重新验证")并且我的标头存在于响应中。但是,那里还有其他东西:
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的一部分。我一直无法找到访问和修改此特定类的配置的方法。
请告知如何摆脱不需要的标题。
我在春天启动 1.5.18.发布
为了更改 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 标头不再添加到响应中,只保留了我的自定义标头。