Spring Boot 1.4迁移至1.5后Hostname校验引发400错误求助
解决Spring Boot 1.5主机名校验导致的400错误
这个问题我之前帮不少开发者处理过,根源是Spring Boot 1.5对内嵌Tomcat的主机名校验做了默认启用的调整——默认只允许localhost、127.0.0.1这类本地标识的Host头,自定义的主机名比如docker_host会被判定为非法,直接返回400错误。哪怕你的docker_host解析到127.0.0.1也没用,因为校验是基于请求里的Host字段值,不是解析后的IP。
下面给你几个可行的解决办法:
1. 配置允许的主机名列表(推荐)
在你的application.properties或application.yml中添加以下配置,明确指定允许的主机名:
properties格式:
# 切换到指定允许主机的模式 server.tomcat.remoteip.host-header-validation=ALLOWED_HOSTS # 列出所有允许的主机名,用逗号分隔 server.tomcat.remoteip.allowed-hosts=docker_host,localhost,127.0.0.1
yml格式:
server: tomcat: remoteip: host-header-validation: ALLOWED_HOSTS allowed-hosts: docker_host,localhost,127.0.0.1
如果需要更灵活的匹配,还可以用正则表达式,比如允许所有以.local结尾的主机:
server.tomcat.remoteip.allowed-hosts=.*\.local,localhost,127.0.0.1
2. 关闭主机名校验(仅推荐开发/测试环境)
如果是开发或测试场景,不想做严格校验,可以直接关闭这个功能:
properties格式:
server.tomcat.remoteip.host-header-validation=DISABLED
yml格式:
server: tomcat: remoteip: host-header-validation: DISABLED
注意:生产环境不建议这么做,会带来潜在的安全风险。
3. 自定义Tomcat容器配置(代码层面)
如果需要更精细化的控制,可以通过Java代码自定义Tomcat的配置:
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.apache.catalina.valves.RemoteIpValve; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatConfig { @Bean public TomcatEmbeddedServletContainerFactory tomcatContainerFactory() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); RemoteIpValve remoteIpValve = new RemoteIpValve(); // 设置允许的主机名 remoteIpValve.setAllowedHosts("docker_host,localhost,127.0.0.1"); factory.addEngineValves(remoteIpValve); return factory; } }
这样配置后,你的docker_host主机名就能正常通过校验,请求http://docker_host:8080/api/portal/v1/login就不会返回400错误了。
内容的提问来源于stack exchange,提问作者Dominik Dorn
相关产品推荐
相关产品推荐

