• Java:get请求下字符串异常问题


     1 背景

    因为有的接口需要进行数据加密校验处理,所以增加了AES。

    AES密码都是16位,不要搞错了,例如:w8IDQKUWKvFfocSn

    AES具体做什么的,这里不做过多说明。

    为了偷懒,直接使用了hutool里面已经封装好的方法。

    接口的传递方式是Get方式。

    测试的时候发现可以正常转换,但是偶尔会出现校验失败的情况。

    这个让人感觉很困惑..

    于是就有了下面的操作之旅

    2 问题定位

    在多轮调试之后,发现有的时候前端传递的值,到了后端就变了。

    例如:调用的时候,返回给前端是 9l4nZr28A+ISGEsklVUBiA==。

    然后请求的时候,发现居然变成了9l4nZr28A ISGEsklVUBiA==。

    中间直接把+变成了空格。

    感觉有些不可思议。

    在做单元测试的时候是没有发现这个情况的。

    那么应该是在传输的时候,+直接给整没了。

    知道问题了就好处理了。

    因为get方式传输参数的话,是拼在后面的,如果使用了特殊字符的话,会直接按照特殊字符的方式传递出去。+号表示的就是空格的意思,所以在后端接收的时候就变成了

    9l4nZr28A ISGEsklVUBiA==

    定位到问题,就相当于解决了80%。接下来解决就简单多了。

    3 解决思路

    既然有特殊字符,那么把特殊字符进行转换就可以了。

    转换的话,要么在传递之前转,要么在传递之后转,基本上就这两种解决思路。

    4 解决方案

    4.1 传递之前转

    在数据传输事前就将数据转换,然后给到需要操作的对象。然后再在后端处理

    4.1.1解决方案

    将加密后的字符串的值中的特殊字符替换成其它字符再给到前端,然后解密的时候再替换回来。

    例如使用replace方法将所有的特殊字符穿不转换未其它的字符,然后再原样转换回来。

    这样就没有特殊字符了。

    4.2 传递之后转

    4.2.1 前端解决方案

    将请求的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%

    4.2.2、后端解决方案

    因为加密字段是后端生成的,那么在传递给前端的时候,需要对传递的参数负责。就需要将当前参数传递的时候就去掉特殊字符。这里我们可以使用URLEncode来进行转换。

    在前端将此字符传递给后端后,后端再进行URLDecode处理,这样对于前端来讲就是无感的。

    总结

    解决问题主要是把特殊字符串处理。处理方案一个是URL转码替换,一个是直接替换。原理都是一样的。

    特别说明下,这个情况下对Get请求方式有效。Post是不需要这么复杂的。至于为什么,可以自己想下。

    问题解决,希望你能小小的一键收藏下,避免迷路。

  • 相关阅读:
    记毕业后的第一份工作—深圳摩尔图像科技(Morpho)
    2023.11.16 hivesql高阶函数之开窗函数
    openharmony容器组件之Navigator
    7 进制数字转换
    Docker
    lodash已死?Radash库方法介绍及源码解析 —— 异步方法篇
    app小程序定制开发的优势|企业软件网站建设
    rosparam参数传递不成功
    只知道SQL数据库?又一国产数据库语言诞生了
    当我们做后仿时我们究竟在仿些什么(二)
  • 原文地址:https://blog.csdn.net/m290345792/article/details/126139514