TOMCAT GET 请求 URL 包含特殊字符 400 错误 (V5 报表访问问题)

             ##   ** TOMCAT GET请求 URL包含特殊字符 400错误(V5报表访问问题)**

问题描述
V5 前端访问报表服务出现 400 错误, 不要慌, 我们先看下结论: 这种问题一般出现再 tomcat 作为应用容器, 才会产生, 一般报错信息如下:
400.png
我看看到了关键的错误信息提示 [tomcat 请求出现 RFC 7230 and RFC3986 的错误], 百度下看下对于这个错误的描述:
RFC 7230 and RFC3986 解释如下
1. 第一种解释如下
这个问题是高版本 tomcat 中的新特性:就是严格按照 RFC 3986 规范进行访问解析,而 RFC 3986 规范定义了 Url 中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4 个特殊字符以及所有保留字符 (RFC3986 中指定了以下字符为保留字符:! * ’ () ; : @ & = + $ , / ? # [])。而我们的系统在通过地址传参时,在 url 中传了一段 json,传入的参数中有 "{" 不在 RFC3986 中的保留字段中,所以会报这个错。

<Connector port=“8080” protocol=“HTTP/1.1”

URIEncoding=“utf-8”

connectionTimeout=“20000”

redirectPort=“8443”

relaxedPathChars=“|{}[],%”

relaxedQueryChars=“|{}[],%”

/>

2. 第二种解释如下

“The valid characters are defined in RFC 7230 and RFC 3986”错误提示,说明访问地址中出现特殊不符合规范的特殊字符。根据 rfc 规范(RFC 3986 规范定义了 Url 中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4 个特殊字符以及所有保留字符 (RFC3986 中指定了以下字符为保留字符:! * ’ () ; : @ & = + $ , / ? # [])), 当在 URL 中使用保留字符时,需要对保留字符进行转义。

tomcat 从特定版本开始进行了特殊字符校验,Tomcat 7.0.73+,Tomcat 8.0.39+,Tomcat 8.5.7+,Tomcat 9.0.0.M12 (markt)+, 因为大多数浏览器并不会对这些保留字符进行转义,所以 tomcat 会拒绝这些请求,为此 tomcat 提供了属性配置:relaxedQueryChars, 可以支持 " < > [\] ^ ` {|} 这 11 个字符的访问

貌似这个错误只发生在 tomcat 升级到 7.0.76 版后

根据(https://bz.apache.org/bugzilla/show_bug.cgi?id=60594) ,

从以下版本开始,有配置项能够关闭 / 配置这个行为:

  • 8.5.x 系列的:8.5.12 onwards

  • 8.0.x 系列的:8.0.42 onwards

  • 7.0.x 系列的:7.0.76 onwards

3. 好了, 接下来我看按照上面的方案做一些开发环境上的修改, 如下:
配置测试.png

最终方案
经过上面的方案修改, 发现并不能起作用: 为何? 因为对于特殊字符的转码还是没有解决, 我们可以 F12 查看 NETWORK 查看请求响应信息和最上面的 400 错误图 的响应信息做对比:
1. 一般通过 VUE 前端调用的方式访问都会调用后台这样的方法:reportPreViewController/reportPreViewController!execReport.m?
转码后的返回信息.png
2. 发现报表可以正常访问了, 最后附上 VUE 前端 改前和改后的代码
改前的疑问.png
改后总结.jpg