美文网首页
tomcat8中URI不支持特殊字符解决方案

tomcat8中URI不支持特殊字符解决方案

作者: 过来摸摸头丶 | 来源:发表于2018-08-16 17:19 被阅读0次

    问题背景:

    由于需要自己写了压缩和解压某个对象的互转,压缩前为json格式的数据,方便修改也方面查看,压缩后是Deflater压缩后的数据,然后在用URLEncoder编码后的数据(由于自己用了get请求,再编码是为了让url能认识)。

    在压缩的时候报错:

    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:476) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:687) ~[tomcat-embed-core-8.5.28.jar:8.5.28]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.28.jar:8.5.28]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed-core-8.5.28.jar:8.5.28]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.28.jar:8.5.28]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.28.jar:8.5.28]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.28.jar:8.5.28]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]
    

    这是因为Tomcat严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。传入的参数中有"{"不在RFC3986中的保留字段中,所以会报这个错。

    解决:

    Tomcat 7.0.76, 8.0.42, 8.5.12 这些版本之后可以定义requestTargetAllow 属性来允许禁止的字符。在tomcat的 catalina.properties文件中添加这一句:

    tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
    

    如果是springboot工程,可以在SpringBootApplication的的main方法中增加

    System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow","|{}");
    

    补充:

    部署到tomcat运行到时候,tomcat8.5.30是没有问题的,tomcat8.5.33却出现了同样到问题。

    去了官网文档查看说:tomcat.util.http.parser.HttpParser. requestTargetAllow(This system property is deprecated. Use the relaxedPathChars and relaxedQueryChars attributes of the Connector instead)

    然后修改server.xml文件,Connector属性修改为如下:

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" redirectPort="8443" />
    

    相关文章

      网友评论

          本文标题:tomcat8中URI不支持特殊字符解决方案

          本文链接:https://www.haomeiwen.com/subject/tqyobftx.html