tomcat升級後報錯: Invalid character found in the request target.

準備上線一個項目。本地環境有兩套環境,一個測試環境,一個正式環境。項目在測試環境已驗證測試經過,準備部署到正式環境。但部署後任何一個請求都報錯,報錯日誌以下:java

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:1000)
    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)

請求連接的格式:apache

http://*.*.com/*/gate.do?req={"current_page":"1","page_size":"20","order_status":"00","order_type":"2","id":"006000009"}

折騰了好久,經檢查發現,正式環境的tomcat版本與測試環境不一致。
繼續查了下資料,原來最新的tomcat新版本增長了一個新特性,就是嚴格按照 RFC 3986規範進行訪問解析,而 RFC 3986規範定義了Url中只容許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及全部保留字符(RFC3986中指定了如下字符爲保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。
因爲請求中包含了特殊的保留字符,因此tomcat沒法正確解析請求參數,致使出錯。
解決方法:
1.下降tomcat的版本。
2.採用最新tomcat版本。對請求連接進行編碼,並修改對應的過濾器,對全部請求連接進行編碼解析處理。tomcat

相關文章
相關標籤/搜索