(1)执行导出 EXCEL 文件的时候,报错:
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
(2)通过 F12 得知,错误码为 400,即:你访问的页面域名不存在或者请求错误。
主要分为两种。
1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
本地跑的项目域名肯定是存在的,问题大概率出现在请求参数有误。
(3)为了验证请求参数的问题,我在导出文件的方法开头,打印出 path 和 fileName。
按理来说,应该是:
path=D:\basic2\classes\artifacts\basic2_war_exploded\20210429165214
fileName=wszlbbTwo0.xls
然而,实际上控制台什么都没打印出来,连这个方法都没进去,这就确定了在解析请求参数的时候就报错了。
(4)面向搜索引擎得知,
从错误日志中看到 Error parsing HTTP request header
负责解析 http 请求的是 org.apache.tomcat.util.http.parser.HttpParser,它对请求 URL 中对字符做了限制,具体代码如下:
IS_NOT_REQUEST_TARGET[] 中定义了一堆 not request target
if(IS_CONTROL[i] || i > 127 || i == 32 || i == 34 || i == 35 || i == 60 ||
i == 62 || i == 92 || i == 94 || i == 96 || i == 123 || i == 124 || i == 125) {
IS_NOT_REQUEST_TARGET[i] = true;
}
转换过来就是以下字符(对应10进制ASCII),也就是URL中不能包含的特殊字符:
- 键盘上那些控制键:(<32或者=127)
- 非英文字符(>127)
- 空格(32)
- 双引号(34)
- #(35)
- <(60)
- >(62)
- 反斜杠(92)
- ^(94)
- TAB上面那个键,~(96)
- {(123)
- }(124)
- |(125)
(5)解决方案:
1、在 conf/catalina.properties 中添加:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
不幸的是,requestTargetAllow 只能配置 |、{、} 允许这三个字符,对于其他的 (例如" < > [ \ ] ^ ` { | } .),在请求时,仍然拦截。如果你仅需要使用这三个字符,配置到此就OK了。重启tomcat,rebuild工程再启动,就能正常使用了。
2、在 conf/server.xml 中的 <Connector> 节点中,添加2个属性:
relaxedPathChars="|{}[]/\,"
relaxedQueryChars="|{}[]/\,"
这2个属性,可以接收任意特殊字符的组合,根据需要可以自行增减。此处我需要的斜杠和反斜杠。
(6)完美运行。
导出文件成功。