• Error parsing HTTP request header 错误解决方法


    以前鼓捣的小玩意,访问突然报错了。

    路径:

    http://192.168.253.4:8080/Kchat/room.html?pub

    报错:

    信息: 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:484)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        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中增加了新特性:

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

    简单点说,就是我们的URL中不能包含一些特殊的字符。

    RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。而我们的系统在通过地址传参时,在url中传了一段json,传入的参数中有"{"不在RFC3986中的保留字段中,所以会报这个错。

    仔细观察我的url,实际上的请求 URL: http://192.168.253.4:8080/Kchat/join%7Cpub%7C231313

    解决方案:

    一、更换低版本的tomcat:

    使用7.0.69以下版本的Tomcat。

    二、修改tomcat配置

    在conf/catalina.properties中最后添加2行:

    tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
    org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

    重启tomcat,rebuild工程再启动,就能正常使用了。

    不幸的是, requestTargetAllow 只能配置|、{、} 允许这三个字符,对于其他的(例如" < > [ ] ^ ` { | } .),在请求时,仍然拦截,如果使用了|{}之外的其他字符那怎么办呢?那就还需要如下配置:

    在conf/server.xml中的<Connector>节点中,添加2个属性:

    relaxedPathChars="|{}[],"
    relaxedQueryChars="|{}[],"

    这2个属性,可以接收任意特殊字符的组合,根据需要可以自行增减。

    三、提前转码(推荐使用)

    前端url 请求转码 window.encodeURI(url)

    作者:Kaspar_Choo
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    重读《从菜鸟到测试架构师》-- 职业生涯的考虑
    重读《从菜鸟到测试架构师》-- 从专家到高手
    重读《从菜鸟到测试架构师》-- 开发团队做的远不仅是开发
    重读《从菜鸟到测试架构师》-- 测试专家的第一步
    重读《从菜鸟到测试架构师》-- 前篇
    使用Nodejs+Protractor搭建测试环境
    简单的算法题之合并数组
    性能测试流程
    性能测试基础
    电脑木马
  • 原文地址:https://www.cnblogs.com/kaspar/p/14517460.html
Copyright © 2020-2023  润新知