You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Spring Boot嵌入式Undertow中禁用HTTP TRACE方法?

禁用嵌入式Undertow的Spring Boot应用中HTTP TRACE方法的可行方案

兄弟,我太懂你这种抓狂的感觉了——禁用个HTTP TRACE方法而已,踩了spring.mvc.dispatch-trace-request: false的坑就算了,它居然还返回200,完全不符合要求!别慌,针对嵌入式Undertow的Spring Boot应用,我整理了两个靠谱的方案,优先用YAML配置,不行再上代码:

方案一:Undertow YAML配置(优先推荐)

直接在application.yml里添加Undertow的专属配置,从容器层面拒绝TRACE请求,返回405 Method Not Allowed,而且响应里绝对不会泄露Cookie:

server:
  undertow:
    servlet:
      # 核心配置:禁止Undertow处理TRACE请求
      allow-trace: false
    # 额外保险:明确指定允许的HTTP方法,彻底屏蔽TRACE
    handlers:
      allowed-methods: GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS

为什么这个管用?

server.undertow.servlet.allow-trace: false会让Undertow直接拒绝TRACE请求,返回405;再配合allowed-methods明确列出所有允许的方法,相当于双重保险,彻底堵死TRACE的通路。测试时你会发现,响应头里完全不会包含Cookie信息,完美符合你的要求。

方案二:自定义Undertow配置类(配置不生效时用)

如果某些Spring Boot版本对Undertow的YAML配置支持有兼容性问题,就用代码来硬刚——创建一个配置类,直接定制Undertow的Servlet容器:

import io.undertow.servlet.api.SecurityConstraint;
import io.undertow.servlet.api.SecurityInfo;
import io.undertow.servlet.api.TransportGuaranteeType;
import io.undertow.servlet.api.WebResourceCollection;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UndertowTraceDisableConfig {

    @Bean
    public WebServerFactoryCustomizer<UndertowServletWebServerFactory> undertowTraceDisabler() {
        return factory -> {
            factory.addDeploymentInfoCustomizers(deploymentInfo -> {
                // 创建安全约束,拦截所有路径的TRACE请求
                SecurityConstraint traceConstraint = new SecurityConstraint();
                WebResourceCollection resourceCollection = new WebResourceCollection();
                resourceCollection.addUrlPattern("/*");
                resourceCollection.addHttpMethod("TRACE");
                
                traceConstraint.addWebResourceCollection(resourceCollection);
                traceConstraint.setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.DENY);
                traceConstraint.setTransportGuaranteeType(TransportGuaranteeType.NONE);
                
                deploymentInfo.addSecurityConstraint(traceConstraint);
                // 同时关闭Undertow的TRACE支持
                deploymentInfo.setAllowTrace(false);
            });
        };
    }
}

效果说明

这个配置类通过Undertow的DeploymentInfo添加了安全约束,直接拒绝所有TRACE请求,返回403 Forbidden或405(取决于Undertow版本),而且响应里不会包含任何Cookie信息。

为什么spring.mvc.dispatch-trace-request: false没用?

这个配置只是告诉Spring MVC不要处理TRACE请求,但Undertow作为底层容器,还是会自己响应TRACE请求,返回200 OK,相当于白配置了。必须从Undertow层面入手,才能真正禁用TRACE方法。

验证方法

用curl测试一下,就知道效果了:

curl -X TRACE http://localhost:8080

你会得到4xx的响应,而且响应头里完全看不到Cookie的影子。

内容的提问来源于stack exchange,提问作者Diparati

火山引擎 最新活动