在接到需求後很快的作完了而後作本地測試發現:php
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
由於是get請求裏面參數數據是查詢人名因此攜帶中文,對此進行了問題分析。html
在當時我就立馬諮詢了百度老師,是由於Tomcat在某個版本里面升級了,對URL遵照RFC規範,對特殊字符不予以放行。
要解決問題有兩個方向:前端
1.解決編碼問題。
2.Tomcat降版本。java
使用postman攜帶中文參數能夠正常訪問到數據,以前也沒有遇到過這樣的問題,所以java服務端是沒問題的,並且服務是使用springboot 1.5.3 ,對應的Tomcat版本是8.5.14,不考慮打成war包部署就打算從編碼入手了。spring
其實問題提及來仍是挺簡單的。。可是由於服務設計的框架因此走錯了路子。。。想記錄一下分析的過程。瀏覽器
從前端那裏攜帶中文參數訪問Tomcat,在Tomcat的訪問日誌裏,看到了攜帶中文參數的請求是這樣的:tomcat
[18/Jun/2019:19:51:18 +0800] 0:0:0:0:0:0:0:1 "GET null null" 400 (0 ms)
請求都沒進來就被過濾掉了。springboot
我在js裏面對參數進行了編碼架構
window.location.href='?p=ware&d=ware-register-query&agentName='+encodeURI($(".agent").val());
在這裏對參數進行了編碼 ,發現並無用。百思不得其解。框架
其實由於咱們是 html+php+java架構的,請求是通過php處理後再發送到java後臺的,在js中編碼過的參數,發送到php處理的時候,會自動解碼:
var_dump(check_merchant_query.'?agentName='.$_GET['agentName']); // 打印拼接的url $req = new httpRequest('get',check_merchant_query.'?agentName='.$_GET['agentName'],null,function($result){return $result;});
這裏打印出來的結果是已經解碼過的,當時沒注意到,只是以爲這個url沒錯,所以多花了許多時間。。
覺得在PHP裏面構造的http請求的get參數是已經編碼過的,因此我將接下來的時間都放在瞭如何設置tomcat對特殊字符放行上。。
若是是正常的html+java,那麼上面的編碼就是沒問題的,只是分析的時候忘記了還要通過php處理。。
最後在Php中對參數進行編碼就能夠啦
$req = new httpRequest('get',check_merchant_query.'?agentName='.urlencode($_GET['agentName']),null,function($result){return $result;});
至於postman爲何可以輸入中文參數就可以直接訪問tomcat呢?是由於postman就至關於一個瀏覽器,在發送請求的時候已經對參數進行了編碼操做啦