問題描述
今天在測試接口的是否使用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中的保留字段中,所以會報這個錯。
…/conf/catalina.properties中,找到最后注釋掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow=| ,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},表示把{}放行
歡迎關注: