Tomcat请求出现3986和7230错误

在实际项目中,有个下载文件的功能。页面传入文件的地址,后台收到地址后进行下载本身是个很平常的功能。很快写好后,开始还正常,因为文件名都是英文,某次文件名为中文时,就尴尬了...


java.lang.IllegalArgumentException: at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:472) ~[tomcat-embed-core-8.5.14.jar:8.5.14]Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986


at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:683) ~[tomcat-embed-core-8.5.14.jar:8.5.14]

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.14.jar:8.5.14]

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core-8.5.14.jar:8.5.14]

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.14.jar:8.5.14]

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.14.jar:8.5.14]

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.14.jar:8.5.14]

at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]


控制台的错误信息,大概的意思是:

在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义

RFC7230和RFC3986规范:

RFC3986规范定义Url中只允许英文(a-zA-Z),数字(0-9)、-_.~4个特殊字符以及所有保留字符。否则接收会出现乱码,中文参数报错情况

那问题清楚了,怎么解决呢?


[if !supportLists]1. [endif]降低Tomcat版本,经排查发现,原来最新的tomcat从7.0.73、8.0.39、8.5.7后增加了一个新特性,就是严格按照 RFC7230和RFC 3986规范进行访问解析,也就是说将Tomcat降至7.0.73以下可以规避这个规范


[if !supportLists]2. [endif]网上一大堆说更改Tomcat的配置可以解决这个问题,但跟我目前的情况不一样,配置解决的问题大多数是传递json字符串的问题,更我们中文传参有所差别

[if !supportLists]3. [endif]通过编码来解决问题


新增一个方法:判断url中是否存在中文字符,如果存在则将中文字符进行编码


Tomcat请求出现3986和7230错误_第1张图片

编码成功后,进入下载文件工具类..


Tomcat请求出现3986和7230错误_第2张图片

亲测有效...

当然对url进行编码时,需要判断下,url里面有没有中文字符,没有的话,就不用编码。

因为RFC3986规范允许英文的传递的,否则对英文在编码的话 效率上也不高

你可能感兴趣的:(Tomcat请求出现3986和7230错误)