一、背景
以往久远项目经过安全扫描后,发现tomcat版本问题有很多安全问题,故同大版本升级了tomcat小版本版本。但是升上去的tomcat,发现有些页面出现400错误。
二、原因
经过排查发现tomcat在升级的时候,增加了新的特性性
1) URL参数包含大括号{}报错
由于Tomcat的新版本中增加了一个新特性,就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。
2) URL参数包含#报错
根据rfc规范,url中不允许有 |,{,}等特殊字符,但在实际生产中还是有些url有可能携带有这些字符,特别是|还是较为常见的。在对url字符的检查都变严格了,如果出现这类字符,tomcat将直接返回400状态码
三、解决方法
按正规编写前端代码,涉及到中文,特殊字符,且需要放到url上面的,请使用encodeURIComponent或encodeURI对URL进行编码。