The valid characters are defined in RFC 7230 and RFC 3986
Spring Cloud
项目中需要使用这样的URL地址(http://localhost:19001/work.html?a=b|c),且因为某种不可告知的原因不能进行URLEncode转换。
Spring Cloud报错:
java.lang.IllegalArgumentException: Invalid character found in
the request target. The valid characters are defined in RFC 7230
and RFC 3986
原因传送门
RFC3986文档规定,Url中只允许包含英文字母(a-z,A-Z)、数字(0-9)、- _ . ~
4个特殊字符以及所有保留字符。
指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]
解决方法是修改tomcat的catalina.properties 配置:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
可是我们是Spring Cloud啊,哪有这个配置文件啊。
查看源码发现读取了系统环境变量tomcat.util.http.parser.HttpParser.requestTargetAllow(略过其中查找Spring配置、查找tomcat-embed-core-8.5.23.jar修改里面配置等等步骤)。
String prop =
System.getProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow");
在启动时增加VM参数
-Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
搞定!
补完:
后来发现在shell里启动时保留字符也出现问题,启动脚本无法传入,最后直接在Application里通过代码直接设置系统属性搞定。
System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow","|{}");
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步