前言:
公司一個在WinServer中運行的很穩定的Web項目遷移到Linux上。並且Web容器版本從tomcat-6.0.41升級到tomcat-7.0.81。遷移後進行測試,在點擊某一個頁面的時候出現了Http:400的錯誤。
Oct 26, 2017 2:15:30 AM org.apache.coyote.http11.AbstractHttp11Processor process
INFO: 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.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:189)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
解決過程:
經過排查,是訪問頁面的url中含有字符“|”,導致這個問題。原因如下:
查詢資料得知,tomcat-7.0.73, 8.0.39, 8.5.7 版本後增加了對請求的校驗。
RFC3986文檔規定,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符。
RFC3986中指定了以下字符爲保留字符:
!*'();:@&=+$,/?#[]
還有一些字符,當他們直接放在Url中的時候,可能會引起解析程序的歧義。這些字符被視爲不安全字符,原因有很多。
->空格Url在傳輸的過程,或者用戶在排版的過程,或者文本處理程序在處理Url的過程,都有可能引入無關緊要的空格,或者將那些有意義的空格給去掉
->引號以及<>引號和尖括號通常用於在普通文本中起到分隔Url的作用
->#通常用於表示書籤或者錨點
->%百分號本身用作對不安全字符進行編碼時使用的特殊字符,因此本身需要編碼
->{}|\^[]`~某一些網關或者傳輸代理會篡改這些字符
故,該錯誤是由於請求中url參數“違法”造成的。
解決辦法:
① 降低tomcat版本(本文未採用);
② 對tomcat的http請求進行特殊字符過濾:
配置tomcat的catalina.properties(路徑:tomcat/config)
添加或者修改:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|
當然還有另外一種方法,就是將所有的參數都進行編碼