tomcat由于 “{}”报 url 400异常的问题(转)

Tomcat控制台报错,错误信息如下:

信息: 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.InternalAprInputBuffer.parseRequestLine(InternalAprInputBuffer.java:235)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2549)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2538)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:662)

经过分析,发现问题是由URL中一个参数params引起的,

这个参数通过JSON2.stringify()转换为一个对象数组,所以包含了{},而恰恰就是这一步在Tomcat 7.0.81版本中出现 了问题,请求链接都是400的状态,就是请求参数有误。

这个问题是由于Tomcat的新版本中增加了一个新特性,就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。

既然分析出了原因,那么就要找解决方案了,其实,解决办法很简单,就是使用encodeURIComponent或encodeURI对包含{}的URL进行编码,这样就可以解决该问题。当然,还有一种办法就是更换Tomcat为支持大括号{}的版本。

发表评论

电子邮件地址不会被公开。 必填项已用*标注