解决Request.getParameter获取不到特殊字符bug问题
作者:丿ZhangT
Request.getParameter获取不到特殊字符bug
今天系统之间联调,发现对端平台发过来的json串,到我们系统获取不到,经过排查是因为对端系统发起的json串中有"#"这类特殊字符,我们用request.getparamter获取不到。
解决办法
如果是前端发送的要用encodeURI编码,编码之后我们用request.getparamter就可以获取到了,然后后端用URLDecoder.decode(加密串) 解密。
如果是后端发送URLEncoder.encode(要加密的串)加密。
使用URLDecoder.decode(加密串) 解密还有个好处就是如果是明文,那么解密出来还是明文,如果是密文,也可以正常解密。
如下案例:
String s = "abc#def"; b = URLDecoder.decode(s); System.out.println("直接解密后数据" + b); b = URLEncoder.encode(s); System.out.println("编码后数据"+" "+b); b = URLDecoder.decode(b); System.out.println("解码后数据" + b);
结果:
request.getParameter过滤特殊字符,导致后台AES解密时报错
Input length must be multiple of 16 when decryp
碰到一个问题,前端用crypto.js加密,后台进行对应的解密,结果有时候会报错,Input length must be multiple of 16 when decryp。
看过网上一些其他的说法,说是需要进行编解码,这个在我的项目里面是有进行过的,所以排除这个问题。
于是继续跟踪,发现是参数不对,前端加密后的参数是这样的(有两个+号):
项目用的是springsecurity做登陆控制,于是研究并跟踪其源码过程,
这个方法获取到的密码是这样的(+号已经没了,变成了空格):
对比发现其中的两个+号不见了,变成了空格,这才是根本原因,所以后台解密肯定不对,于是继续跟踪这个方法,
终于发现了大问题,是这个request.getParameter这个方法在搞鬼,这个方法会自动过滤特殊字符,而加密后的密码里包含+号,自动变成了空格,所以导致不对了。
于是去百度request.getParameter()方法过滤特殊字符的问题以及研究了一下源码,找到了一堆方法,最多的解决方法就是对参数进行url转义,可以使用param = encodeURIComponent(param),之后再进行请求,问题解决。
以前还真没碰到过,算是涨知识了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。