最近在ssm实践项目中遇到了The valid characters are defined in RFC 7230 and RFC 3986这个问题,折腾了两天时间终于搞定了,记录一下心得。
1、首先贴出报错日志:
09-Apr-2019 14:55:11.427 信息 [http-nio-8089-exec-8] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:479)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocolSocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutorWrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
大概意思为:在请求目标中找到无效字符,有效字符在RFC 7230和RFC 3986中定义。
就是说http请求的url中有非法字符,而我的项目所需请求url为:http://localhost:8089/teacher/deleteFile?path=D:\Projects\MyEducationSystem-code\EducationSystem\target\EducationSystem\newuploads\古代书法\古代书法01.txt
url中有?,\,/,还有中文字符。
显然问题出在了这里。
2、网上资料
网上找到一些有用信息:
(1)RFC 3986文档规定,Url中只允许包含英文字母(a-z,A-Z)、数字(0-9)、- _ . ~ 4个特殊字符以及所有保留字符。
(2)RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]
由此我知道是我的url中符号违反了RFC 3986和RFC 7230。
而且跟tomcat版本有关:我的项目使用的tomcat为:Tomcat8.5.39
而在Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。
3、解决方案
综上,有3种解决方案:
(1)使用Tomcat7.0.69之前的版本;
(2)对url的特殊字符进行转义
(3)修改tomcat配置文件
我先采用了第三个方法,在tomcat8.5.39版本下修改配置文件tomcat.xml和catalina.properties均未见效!
然后采用第一种方法进行转义,发现很是麻烦,也未成功!
最后果断采用了第一个方法,更换了低版本的tomcat(7.0.68).
方法如下:
进入tomcat官网:http://tomcat.apache.org/
点击Archives进入选择合适的版本,进入bin目录下载。
在项目中更换tomcat即可!
此时,重新启动tomcat,The valid characters are defined in RFC 7230 and RFC 3986问题顺利解决,但是我的项目url中有中文字符,springmvc接收到的url显示为中文乱码,导致功能失败:
调试信息:
可见删除文件函数传入的path中文显示为乱码,删除失败!
需要修改tomcat的配置文件tomcat.xml:
在这里添加上URIEncoding=“UTF-8”,重启tomcat,问题解决!
对于高版本的tomcat如何让解决类似问题,有空再学习哦!