Tomcat7.0非SpringBoot应用GET特定URL返回400配置咨询
问题描述
首次配置负载均衡时遇到健康检查故障:针对特定URL做检测时,部署在Tomcat 7.0容器上的非Spring Boot Java应用未返回有效响应,而是返回400错误状态码,服务实际处于可用状态。
执行如下测试curl命令时,预期返回200状态码:
curl -I --verbose --noproxy * -H Host: -H User-Agent: -H Accept: http://test.company.com:8080/accountBatch/jsf/landingPage.xhtml
实际收到错误响应:
< HTTP/1.1 400 Bad Request HTTP/1.1 400 Bad Request
未检索到非Spring Boot应用对应的参考配置方案。
故障根因
400错误的核心原因是测试命令和负载均衡检测请求携带了空值Host请求头,触发了Tomcat 7的HTTP请求合法性校验:
- HTTP/1.1 规范强制要求所有请求必须携带合法的非空Host头,Tomcat 7默认开启严格请求校验,收到空Host头时会直接在容器层返回400响应,不会将请求转发到上层业务应用处理。
- 测试用curl命令中
-H Host:写法就是显式传递了空值的Host头,同理如果负载均衡健康检查规则中未配置正确的Host头,也会触发同样的问题。 - 额外注意:
curl -I参数发送的是HEAD请求而非GET请求,如果后续校验出现405错误,需要调整请求方法。
解决方案
不需要修改业务应用代码,按以下步骤调整即可:
- 修正测试curl命令,删除空Host头参数,显式传递合法的Host值,示例命令如下:
执行后即可正常收到200响应。curl -i --verbose --noproxy * -H "Host: test.company.com:8080" -H "User-Agent: LB-HealthCheck" -H "Accept: */*" http://test.company.com:8080/accountBatch/jsf/landingPage.xhtml - 调整负载均衡的健康检查配置:在检测请求的请求头配置项中,填写和访问服务匹配的Host值(即
test.company.com:8080,如果是直连后端节点也可以填对应节点的IP+端口),不要留空。 - 不推荐的兼容方案:如果因特殊场景必须允许空Host头访问,可以修改Tomcat 7配置目录下的
conf/server.xml文件,找到对应服务的Connector节点,添加配置requestValidationEnabled="false"关闭严格请求校验,重启Tomcat后生效。该配置会降低Tomcat的请求安全校验能力,非必要不使用。
内容的提问来源于stack exchange,提问作者JCP
相关产品推荐
相关产品推荐

