当前位置: 首页 > 知识库问答 >
问题:

Tomcat阀强制特定的缓存控制头

王泓
2023-03-14

我希望在响应中正确设置Cache-Control和ETag标头。为此,我通过Spring Security配置禁用了请求缓存:

httpSecurity.headers().cacheControl().disable();
ResponseEntity.ok()
        .header("Cache-Control", "max-age=60")
        .header("ETag", "my-tag")
        .build()
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上

共有1个答案

黄博艺
2023-03-14

为了更改阀门的配置,我必须使用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的配置后,不需要的缓存控制头不再添加到响应中,只保留了我的自定义头。

 类似资料:
  • 我正在将使用JSP的5年前的Spring MVC应用程序移植到Spring Boot。因此,根据http://docs.spring.io/spring-boot/docs/current-snapshot/reference/htmlsingle/#boot-features-jsp-limittings中的示例,我使用了“war”打包。 我很乐意增加tomcat缓存,但是我没有找到在Sprin

  • 使用 rax-plugin-pwa 插件,可以方便快捷的使用 Service Worker 控制缓存,以获得更快的加载速度。 首先,安装 build-plugin-rax-pwa 插件依赖: $ npm install build-plugin-rax-pwa --save 在工程配置 build.json 中添加 pwa 插件并配置缓存目标: { "plugins": [ [

  • 我有一个问题与超文本传输协议头-缓存控制:max-age=1234我的源有那个头,但任何方式发送请求和接收304.我需要可能我错过了什么?还有一个,源除了缓存控制: max-age=1234在"响应头"有缓存控制: max-age=0在"请求头",可能是它的影响。 我的一个资源响应标题,示例: > 远程地址:10.6.237.13:443请求请求方式:GET状态码:304未修改

  • 问题内容: 因为我以前使用过jQuery的AjAX方法,所以我对XMLHttpRequests较新。但是,我需要在网络工作者中工作,现在我必须使用经典的XMLHttpRequest来解决性能问题。 我正在尝试从jquery 重建-property。如果应该禁用缓存,请添加以下内容: 但是,如果我想强制缓存(不是阻止),应该设置哪个标头? 问题答案: 您可以设置各种标头来鼓励缓存,但是它们(包括您使

  • 我正在使用部署在tomcat6中的grails应用程序,我希望能够在“逐页”的基础上启用或禁用服务器端页面缓存。换句话说,我希望能够指定“缓存页面A,但不缓存页面B和C” 这样的事情可能吗?如果可能,最好的方法是什么? 提前感谢。

  • 我想在缓存控制头中设置max age以响应。我已经写了如下,但仍然有max-age 0。我想只为一种方法设置max age,所以我不想禁用默认值。我认为应该是ovveride。 有人知道我做错了什么吗?