• java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986


    信息 [http-nio-8080-exec-317] org.apache.coyote.http11.AbstractHttp11Processor.process 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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:285)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1045)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

    tomcat对http头验证,当在浏览器中访问时 URL中带有特殊字符,如花括号冒号时,就会出现这个错误。

    查到的这几种解决方法:

    1、更换低版本tomcat。(目前用的tomcat8.0.48)

      这个就算了,不同版本tomcat存在优化差异,到时候许多配置也会更改。

    2、前端http请求的时候对参数进行URL编码处理,理论上是绝对可行的

      我都没查出是那个接口报的错,因为对外提供了接口,只在tomcat日志里看到的错误,按个排查太慢了

    3、使用 Post 方法提交数据

      改动太多了

    4、在 conf/catalina.properties  添加或者修改:

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

      我先试试这种,观察一段时间

      另一种没看懂,

    修改tomcat/conf/catalina.properties的配置文件
    Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。
    具体来说,就是添加了些规则去限制HTTP头的规范性
    org.apache.tomcat.util.http.parser.HttpParser#IS_NOT_REQUEST_TARGET[]中定义了一堆not request target
    if(IS_CONTROL[i] || i > 127 || i == 32 || i == 34 || i == 35 || i == 60 || i == 62 || i == 92 || i == 94 || i == 96 || i == 123 || i == 124 || i == 125) {
    IS_NOT_REQUEST_TARGET[i] = true;
    }
    转换过来就是以下字符(对应10进制ASCII看):
    键盘上那些控制键:(<32或者=127)
    非英文字符(>127)
    空格(32)
    双引号(34)
    #(35)
    <(60)
    >(62)
    反斜杠(92)
    ^(94)
    TAB上面那个键,我也不晓得嫩个读(96)
    {(123)
    }(124)
    |(125)

    5、使用Connector中relaxedPathChars和relaxedQueryChars属性可以解决问题.找到tomcat/conf/server.xml,在Connector中增加这两个配置.
      <Connector port="8080" protocol="HTTP/1.1" relaxedPathChars="[]{}|^" relaxedQueryChars="[]{}|^" />

      暂未尝试

    参考:https://www.cnblogs.com/dygrkf/p/9088370.html

         https://www.dazhuanlan.com/2020/03/20/5e7404d60e4b3/

      

  • 相关阅读:
    [转]Python跳过第一行读取文件内容
    Batch Apex之Database.Stateful
    Package.xml文件可取得Metadata
    SFDC 关于Custom Object在Lightingアプリケーションビルダー中可以配置「Chatter」和「活動」
    SFDC 在Batch Apex中使用Aggregate SOQL统计查询语句及结果
    SFDC 为什么Label有时候在同一行,有时候换行了呢?
    SFDC String.isEmpty vs. String.isBlank
    SFDC CustomLabels vs. CustomMetadata
    SFDC Custom Object里无法设置Search Layout的解决方法
    租房注意点
  • 原文地址:https://www.cnblogs.com/wjq-/p/14884846.html
Copyright © 2020-2023  润新知