1. 程式人生 > >tomcat 請求出現RFC 7230 and RFC3986的錯誤,解決辦法

tomcat 請求出現RFC 7230 and RFC3986的錯誤,解決辦法

問題描述

今天在測試介面的是否使用tomcat啟動服務,然後通過get請求去測試介面,頁面返回報的錯誤是400。
tomcat中錯誤如下圖所示:

請求引數為 location=[{"lng":108.871597,"lat":34.194412}]
很明顯,在location的引數為json串
查詢日誌發現是有些地址直接被tomcat認為存在不合法字元,返回HTTP 400錯誤響應

測試問題

通過junit單元測試發現介面方面並沒有錯誤,而且日誌顯示的是不合法字元,就針對於tomcat進行測試,將服務放在了jetty伺服器中,介面顯示正常,所以肯定是tomcat有問題

問題解決

這個問題是高版本tomcat中的新特性:就是嚴格按照 RFC 3986規範進行訪問解析,而 RFC 3986規範定義了Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元(RFC3986中指定了以下字元為保留字元:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。而我們的系統在通過地址傳參時,在url中傳了一段json,傳入的引數中有"{"不在RFC3986中的保留欄位中,所以會報這個錯。

貌似這個錯誤只發生在tomcat升級到7.0.76版後
根據(https://bz.apache.org/bugzilla/show_bug.cgi?id=60594) ,
從以下版本開始,有配置項能夠關閉/配置這個行為:
8.5.x系列的:8.5.12 onwards
8.0.x系列的:8.0.42 onwards
7.0.x系列的:7.0.76 onwards

…/conf/catalina.properties中,找到最後註釋掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow=|  ,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},表示把{}放行

 

歡迎關注: