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=|{},表示把{}放行

 

歡迎關注: 

 


免責聲明!

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



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