Tomcat日志中出现400错误的常见原因
Tomcat遵循RFC 7230和RFC 3986规范,对URL及参数中的特殊字符(如{}、|、\、<、>等)有严格限制。若客户端请求的URL或参数中包含未转义的非法字符(例如GET请求的查询参数中直接使用{),Tomcat会因无法解析请求目标而返回400错误。此类问题常见于前端未对参数进行encodeURIComponent编码或手动拼接URL的场景。
请求的URL路径不符合规范(如拼写错误、大小写不匹配、路径不存在),或路径中包含非法字符(如空格、特殊符号),Tomcat无法定位到对应的资源或Servlet,从而返回400错误。例如,访问/api/user/info时,若路径拼写为/api/user/infо(о为西里尔字母),Tomcat会判定为无效路径。
请求头中存在以下情况会导致400错误:
Host: localhost:abc中的端口号abc不是数字,Tomcat会直接拒绝处理该请求。POST、PUT等方法的请求体(如上传文件、提交表单数据)大小超过Tomcat配置的maxPostSize参数限制(默认值为2MB),Tomcat会返回400错误。此类问题常见于上传大文件的场景,需调整server.xml中Connector的maxPostSize参数(如设置为-1表示无限制,或根据需求设置为更大的值)。
Tomcat的server.xml或web.xml配置错误可能导致400错误:
server.xml中Connector的URIEncoding未设置为UTF-8,导致URL中的中文或特殊字符无法正确解析;web.xml中Servlet的url-pattern配置错误,使得请求无法映射到正确的Servlet;relaxedPathChars或relaxedQueryChars参数,导致Tomcat拒绝包含合法特殊字符(如[]|{}^``<>)的请求。客户端发送的请求不符合HTTP协议规范,例如:
Content-Length、Host);Content-Type不匹配(如Content-Type为application/json但请求体为XML格式)。高版本Tomcat(如9.0.98及以上)加强了HTTP规范的遵守,对请求的合法性检查更严格。若应用是从旧版本升级到新版本,可能因配置或代码未适配新版本的严格检查而导致400错误。例如,旧版本允许的非法字符在新版本中会被拒绝,需调整配置或修改代码以适配新版本的要求。