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),之后再进行请求,问题解决。

以前还真没碰到过,算是涨知识了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值