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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM