URL中的带有加号(+)的字符串传给后端变成空格了

561 阅读1分钟

BUG的如何产生的

今天在跟三方对接时发现的一个问题,我这边生成给三方调用接口使用的token返回的时候是带有+号的,然后三方调用接口传给我的也是带+号的,奇怪的现象发生了我这边接收的时候+号全变成空格了,最终导致验签失败了。

image.png

如何解决的

经过一波查询得知,URL中带有+号属于特殊符号,默认会进行转义。

有以下几种解决方案:

  1. 让三方的开发把+号统一都转换为%2B,然后我这边接收就是正常的了
  2. 我这边把服务端接收到的token中的空格全部替换为+

当然这个问题是一个很简单的问题,主要是自己起初写生成token时也没注意到这个问题,所以我选择了第2个方案

生成token的方法用的 hutool 工具里的AES

//16位AES对称密钥
SecureUtil.aes("0123456789123456".getBytes()).encryptBase64(data);

最终完成替换的部分代码

//第一种encode后替换
String token = "UMa9cJPXvD5lw/AUJOqtZH9LWS6g2ORAQvR/T 0KJY3bXBGthDB0w/avi0ZLSptS/t1KbsD1rLvEX30U0QmVPiZ9MB9EblYxTrgSjxmXmYajSZ0FRd0IeoADI7xI/wEaRmb8kPzPt/AzrxZ/B yzmvsVqMy5hLnkX2fh3jjj1 ktiOjA2VhIywO8NkZYlSPeSn1KWqypBf/RziIci f69jx1q9IHUkaO15o2CEbn8tLi/9wdK0AzZe67YaweezS6uuqbuD3SQ3ENKH083rEnloF9fGqiZpU9MUlv/IOa2uR3D03rqtlKPqAeJoox1oDpACUhzpppUtldEIytnxY3gQ==";
String stToken = URLUtil.encode(token).replaceAll("%20", "+");


//第二种提示空格替换
String stToken = URLUtil.encode(token).replaceAll(" ", "+");