才子佳人博客

我的故事我讲述

tomcat9.0中对get方法中文参数异常的处理办法
 
来源:xjh  编辑:xjh  2018-09-30

错误:
Message Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

原因:高版本tomcat9.0对uri有严格的规定。

这个问题是高版本tomcat中的新特性:就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + dollar符号 , / ? # [ ])。而我们的系统在通过get方法传参时,在url中传了一段中文字符,传入的参数中有非保留字段,所以会报这个错。

解决办法:

1、在tomcat 的conf/目录下修改catalina.properties文件,在文件最后添加:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

2、在tomcat的conf/目录下修改server.xml文件,在端口处添加URIEncoding编码:

<Connector port="80" protocol="HTTP/1.1" URIEncoding="UTF-8"
               connectionTimeout="20000"
               redirectPort="8443" />

3、对get方法传入的中文参数用javascript 的encodeURIComponent()函数进行编码。其中第三条是关键。

<script type="text/javascript">

document.write(<iframe id="related" src="/Templates/article_related.jsp?bookmark=);

document.write(encodeURIComponent(脑网络));

document.write(" width="95%" height="100%" frameborder="0" align="left" allowtransparency="false"></iframe>);

</script>

原始异常错误:

Type Exception Report

Message Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

Exception
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
 org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:467)
 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:294)
 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
 org.apache.coyote.AbstractProtocolConnectionHandler.process(AbstractProtocol.java:770)
 org.apache.tomcat.util.net.NioEndpointSocketProcessor.doRun(NioEndpoint.java:1415)
 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 java.base/java.util.concurrent.ThreadPoolExecutorWorker.run(Unknown Source)
 org.apache.tomcat.util.threads.TaskThreadWrappingRunnable.run(TaskThread.java:61)
 java.base/java.lang.Thread.run(Unknown Source)


Note The full stack trace of the root cause is available in the server logs.


Apache Tomcat/9.0.12


分类:网络日志| 查看评论
相关文章
文章点击排行
本年度文章点击排行
发表评论:
  • 昵称: *
  • 邮箱: *
  • 网址:
  • 评论:(最多100字)
  • 验证码: