以后碰到项目中奇怪问题要进行记录啊,这就算是我记录的第一个问题。
首先这个项目工具是IDEA,环境技术是SpringBoot(SSM)项目
09:25:11.592 INFO [nio-8802-exec-5] o.a.c.http11.Http11Processor - Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
这个问题也不算难,网上有很多现成的解决方案,基本都是修改tomcat的配置,但我一个小组员不可能更改配置,只能再找解决方案。
但我这问题很奇怪,chrome不报错,只有使用IE(8-11)会报这个问题,才发现是字符转义的问题,英文数字没事,只有汉字会出问题。而问题出现的原因是将参数直接放在url进行传递
我们这边的烂代码是
var url = '/noc/wtdj/saveOrEditWenTiDanJu'+
'isAdd=' + isAdd +
'&taxRate=' + taxRateVal +
'&moneyIncludeTax=' + moneyIncludeTaxVal +
'&goodsAmount=' + goodsAmountVal +
'&goodsMode=' + goodsModeVal +
'&goodsUnit=' + goodsUnitVal +
'&goodsName=' + goodsNameVal +
'&mainId=' + idVal +
'&userName=' + userNameVal +
'&userTaxNo=' + userTaxNoVal +
'&userAddr=' + userAddrVal +
'&userBankinfo=' + userBankinfoVal +
'&totalMoneyIncludeTax=' + totalMoneyIncludeTaxVal +
'&oldDataType=' + oldDataType;
本身这是一个表单,也不知道为什么不直接用表单提交,我也不能修改大结构,只能将传参数的方法改成
data:{
isAdd:1,
taxRate : $('#taxRate').val(),
moneyIncludeTax : $('#moneyIncludeTax').val(),
goodsAmount : $('#goodsAmount').val(),
goodsMode : $('#goodsMode').val(),
goodsUnit : $('#goodsUnit').val(),
goodsName : $('#goodsName').val(),
mainId : $('#id').val(),
userName : $('#userName').val(),
userTaxNo : $('#userTaxNo').val(),
userAddr : $('#userAddr').val(),
userBankinfo : $('#userBankinfo').val(),
oldDataType : $('#oldDataType').val(),
totalMoneyIncludeTax : $('#totalMoneyIncludeTax').val()
},
ajax中添加对象传参数,问题解决
不知有没有大神解释一下,在url中用?&传递参数和直接用data传对象的区别…
———————————————————————————————————————
经过进一步研究,发现高版本的tomcat会验证请求,简单的说参数里不能含有中文和一些特殊符号。chrome 和火狐会自动转码,但IE不会,所以可能只有IE会报这个异常,解决方法除了设置tomcat 外,最直观的方法就是将有可能不合法的参数进行转码
具体的方法:
前端页面
str = encodeURI(encodeURI(str))
后台controller
java.net.URLDecoder包(不需要引入),需要加异常处理或者抛出异常
try {
str = URLDecoder.decode(str,"utf-8");
} catch (Exception e) {
e.printStackTrace();
}
这里由于本身有可能出现空指针异常,所以我没有把异常写的很详细,也没有把多个需要转码处理的放到同一个try中,不知道有没有大神提供更好的解决方式
另外需要注意的是加时间戳的时候,也要new Date().getTime()的方式加,不然直接new Date()会出现中文字符。
参考博文:
https://blog.csdn.net/fireofjava/article/details/80856887
https://www.cnblogs.com/lr393993507/p/7755867.html
https://www.cnblogs.com/wsygdb/p/7661220.html
完美!!!