因为有的接口需要进行数据加密校验处理,所以增加了AES。
AES密码都是16位,不要搞错了,例如:w8IDQKUWKvFfocSn
AES具体做什么的,这里不做过多说明。
为了偷懒,直接使用了hutool里面已经封装好的方法。
接口的传递方式是Get方式。
测试的时候发现可以正常转换,但是偶尔会出现校验失败的情况。
这个让人感觉很困惑..
于是就有了下面的操作之旅
在多轮调试之后,发现有的时候前端传递的值,到了后端就变了。
例如:调用的时候,返回给前端是 9l4nZr28A+ISGEsklVUBiA==。
然后请求的时候,发现居然变成了9l4nZr28A ISGEsklVUBiA==。
中间直接把+变成了空格。
感觉有些不可思议。
在做单元测试的时候是没有发现这个情况的。
那么应该是在传输的时候,+直接给整没了。
知道问题了就好处理了。
因为get方式传输参数的话,是拼在后面的,如果使用了特殊字符的话,会直接按照特殊字符的方式传递出去。+号表示的就是空格的意思,所以在后端接收的时候就变成了
9l4nZr28A ISGEsklVUBiA==
定位到问题,就相当于解决了80%。接下来解决就简单多了。
既然有特殊字符,那么把特殊字符进行转换就可以了。
转换的话,要么在传递之前转,要么在传递之后转,基本上就这两种解决思路。
在数据传输事前就将数据转换,然后给到需要操作的对象。然后再在后端处理
将加密后的字符串的值中的特殊字符替换成其它字符再给到前端,然后解密的时候再替换回来。
例如使用replace方法将所有的特殊字符穿不转换未其它的字符,然后再原样转换回来。
这样就没有特殊字符了。
将请求的URL进行转义处理,这样就不会有问题了。
JS中encodeURIComponent(URL)编码,将编码的值在URL上传递过去就可以了。
后端使用URLDecode操作下,否则字符串对不上。
9l4nZr28A+ISGEsklVUBiA== 转换之后就变成了9l4nZr28A%2BISGEsklVUBiA%3D%3D
这样传递就不会字符变异了。
常用特殊字符列表:
序号 | 字符 | 特殊字符含义 | URL编码 |
1 | + | URL 中+号表示空格 | %2B |
2 | 空格 | URL中的空格可以用+号或者编码 | 20% |
3 | / | 分隔目录 | %2F |
4 | ? | 分隔实际的 URL和参数 | %3F |
5 | % | 指定的特殊字符 | 25% |
6 | # | 书签 | 23% |
7 | = | URL 中指定参数的值 | %3D |
8 | & | URL 中指定的参数间的分隔符 | 26% |
因为加密字段是后端生成的,那么在传递给前端的时候,需要对传递的参数负责。就需要将当前参数传递的时候就去掉特殊字符。这里我们可以使用URLEncode来进行转换。
在前端将此字符传递给后端后,后端再进行URLDecode处理,这样对于前端来讲就是无感的。
解决问题主要是把特殊字符串处理。处理方案一个是URL转码替换,一个是直接替换。原理都是一样的。
特别说明下,这个情况下对Get请求方式有效。Post是不需要这么复杂的。至于为什么,可以自己想下。
问题解决,希望你能小小的一键收藏下,避免迷路。