不羡鸳鸯不羡仙,一行代码调半天。原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。
起因:用户在请求接口的时候,请求url
中携带中文参数,导致返回400
。查询日志发现报错:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 。
原因:Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。【为了堵洞?(  ̄ー ̄)】
具体类的坐标:org.apache.tomcat.util.http.parser.HttpParser#IS_NOT_REQUEST_TARGET[]
大体意思就是,有以下字符都过不去(对应10进制ASCII看):
-
键盘上那些控制键:(<32或者=127)
-
非英文字符(>127)
-
空格(32)
-
双引号(34)
-
#(35)
-
<(60)
-
>(62)
-
反斜杠(92)
-
^(94)
-
TAB上面那个键(96)
-
{(123)
-
}(124)
这个问题碰到了其实还是很恶心的,业务肯定是改不动。提供5
个解决方法如下。
解决办法1
配置tomcat的catalina.properties
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
但这种方法只适合对应英文,如果为中文就不行。
如果有?和&这些符号,那么都得写进去。
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}?&
解决办法2
最简单粗暴方法,降低tomcat版本。此方法比较快,也不需修改配置。
解决办法3
对相应的参数进行编码,就是将所有的参数都进行urlencode。
解决方法4
选择另外的参数传递方法,比如post或者localStorage。
解决方法5
选择另外的容器,如jetty。不过配置文件需要修改,accesslog配置比tomcat麻烦。另:undertow也报400。
tomcat真贴心呀,给我找了一天的活。
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。
后台回复“加群”,带你进入高手如云交流群
推荐阅读:
一图解千愁,jvm内存从来没有这么简单过!
实力解剖一枚挖矿脚本,风骚操作亮瞎双眼
又一P1故障,锅比脸圆
传统企业的人才们,先别忙着跳“互联网”!
面试官很牛,逼我尿遁
又一批长事务,P0故障谁来背锅?
一天有24个小时?别开玩笑了!
《程序人生》杀机!
可怕的“浏览器指纹”,让你在互联网上,无处可藏
2w字长文,让你瞬间拥有「调用链」开发经验
996的乐趣,你是无法想象的
作为高级Java,你应该了解的Linux知识(非广告)
必看!java后端,亮剑诛仙(最全知识点)
学完这100多技术,能当架构师么?(非广告)
Linux上,最常用的一批命令解析(10年精选)
数百篇「原创」文章,助你完成技术「体系化」