1.接到需求后快速完成前言然后在本地测试发现:java.lang.IllegalArgumentException:Invalidcharacterfoundintherequesttarget。RFC7230和RFC3986定义了有效字符,因为get请求中的参数数据是查询人的姓名,所以带中文,进行问题分析。2、分析过程当时立马请教了百度老师,因为Tomcat升级了某个版本,符合URL的RFC规范,没有放出特殊字符。解决问题有两个方向:1.解决编码问题。2.降级Tomcat版本。使用postman携带中文参数可以正常访问数据,之前没遇到过这样的问题,所以java服务器没有问题,而且服务使用的是springboot1.5.3,对应的Tomcat版本是8.5.14,不考虑计划在部署为war包时开始编码。其实问题很简单。.但是因为服务设计的框架,我走错了路。..我想记录分析过程。前端用中文参数访问Tomcat。在Tomcat的访问日志中,我看到带中文参数的请求是这样的:[18/Jun/2019:19:51:18+0800]0:0:0:0:0:0:0:1"GETnullnull"400(0ms)请求还没进来就被过滤掉了,我把参数编码在jswindow.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=newhttpRequest('get',check_merchant_query.'?agentName='.$_GET['agentName'],null,function($result){return$result;});此处打印的结果已经解码。当时没注意,只是觉得url是对的,所以花了很多时间。.以为PHP构造的http请求的get参数已经编码好了,于是就把剩下的时间花在了如何设置tomcat允许特殊字符上。.如果是正常的html+java,那么上面的编码是没有问题的,只是我分析的时候忘了经过php处理。.最后,只需在Php中对参数进行编码$req=newhttpRequest('get',check_merchant_query.'?agentName='.urlencode($_GET['agentName']),null,function($result){return$result;});至于为什么postman输入中文参数就可以直接访问tomcat?因为postman相当于一个浏览器,在发送请求的时候已经对参数进行了编码。
