如何在Spring Boot嵌入式Undertow中禁用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




