前言
网上有很多关于tomcat版本过高导致的协议问题的解决方式,但是jar版本(例如spring boot内置的)的很少,特此总结了一下,如果只想看spring boot的解决方式,跳到最后一行
RFC 3986规范
1.RFC 3986文档规定,Url中只允许包含英文字母(a-z,A-Z)、数字(0-9)、- _ . ~ 4个特殊字符以及所有保留字符。
2.RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]
不安全字符
还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。
空格,Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉
<>引号和尖括号通常用于在普通文本中起到分隔Url的作用
# 通常用于表示书签或者锚点
% 百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
{ } | \ ^ [ ]` ~ 某一些网关或者传输代理会篡改这些字符
解决方式
转义
将请求值URL编码(但是spring boot默认只会URL解码一次,二次解码需要另行添加)
更换版本
更换Tomcat为较低版本(提示:同样的问题也存在于 >=8.0.39和>=9.0.0.M12)
使用POST
使用POST提交数据内容(body中)
修改配置
1.tomcat解压版/安装版
1.~/conf/catalina.properties中,找到最后注释掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow选项,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},选项是按照字符分隔为一个数组,表示放行["|","{","}"]
2.或者你可以在~/conf/catalina.properties最后一行添加org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
2.内置版(spring boot等内置的tomcat)
在启动时加入tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
实例:# java -jar -Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{} demo-0.0.1-SNAPSHOT.jar