在接到需求后很快的作完了而后作本地测试发现: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就至关于一个浏览器,在发送请求的时候已经对参数进行了编码操做啦