...
7.0.69+
8.0.39+
8.5.7+
二、问题 二、问题原因
请求的URL在编码后的中文字符串带反斜杠,这是RFC文档中规定的不安全字符,Tomcat在高版本中增加的安全验证,凡是RFC 3986中非URL可携带的字符,都会返回400错误。
这个问题根本都还没有进入到业务层就已经被拦截返回了。
RFC 3986文档关于特殊字符的定义
- RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。
- RFC3986中指定了以下字符为保留字符:
! * ' ( ) ; : @ & = + $ , / ? # [ ] - 以下为不安全字符
- 空格 Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉
- 引号以及<> 引号和尖括号通常用于在普通文本中起到分隔Url的作用
通常用于表示书签或者锚点
- % 百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
- {}|^[]`~ 某一些网关或者传输代理会篡改这些字符
三、解决办法
1)配置tomcat/conf下的catalina.properties(tomcat 9测试发现编码后依然存在问题)最优解决方案:对于所有服务器传参带特殊符号或者中文的时候必须使用encodeURLComponent 进行编码(在java中对应为 java.net.URLEncoder.encode("...","UTF-8"),但实际中因为不同应用服务器编码不同,有可能使用encodeURLComponent 编码后服务器认为还是存在非法字符,这时候URL传参依然是不生效的,因此是不建议在URL中使用中文,对于带中文的传参建议使用post方式或者Base64编码后传递paramsInfoBase64。
补充方案:以下方案在部分版本Tomcat可以解决URL带中文和特殊字符传参的问题,如果添加后没有解决,就是这个Tomcat版本不支持这样的方式,请使用【最优解决方案所提供的建议】:
添加或者修改: 1)配置tomcat/conf下的catalina.properties(tomcat 9测试发现编码后依然存在问题),添加或者修改:
tomcattomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
2)参数都进行编码(tomcat 9测试发现编码后依然存在问题,可能编码方式不对) 此修改添加或者修改后可以解决传参带特殊符号的问题。
3)使用post方式(可以)
4)降级tomcat(可以),windows一键安装包自带的tomcat版本比较低,没有此问题。
5)cong 2)在cong/server.xml增加 urlencoding编码(测试发现编码后依然存在问题)urlencoding编码,这个方法可以解决传参带中文乱码的问题,但传参带特殊字符的话没有办法处理。
Viewtracker |
---|