解决Base64编码参数在传递过程中“+”号变空格问题

大家好,今天小编来分享一个在工作中容易踩到的坑,Base64加密参数在传递过程中“+”号变空格。小编通过查阅资料发现了问题原因和解决方法,接下来就具体分析一下问题。 

1、问题发现

  • 我们在调用第三方接口时,都会将请求数据做一次base64编码,然后放到data参数上。
  • 然后某些数据做base64编码后有+,如base64编码为eyJub3RlcyI6IuS7o+eggSJ9Cg== 。
  • 然后直接拼到data参数上,即data=eyJub3RlcyI6IuS7o+eggSJ9Cg==,组织成http请求发出。

做个测试接口调试一下看看,问题场景如下:

我们可以看到,原本的+变成了空格,这个坑很容易踩到。

2、问题原因

 这个问题和urlencode编码有关,urlencode编码,一般来说,除字母、数字和*,.,-和_这些字节原样输出外,其它字节都会编码为%XX(16进制)的形式。

但是有一个特例,如下

public static void main(String[] args){
        try {
            String enc = URLEncoder.encode(" ", "UTF-8");
            System.out.println(enc);   // 输出+号

            String dec = URLDecoder.decode("+", "UTF-8");
            System.out.println(dec);   // 输出空格
        }catch (Exception e){
            System.out.println("异常");
        }
    }

注意:在新的RFC 2396规范中,空格其实也可以编码成%20,而解码时,+号与%20都会被解码为空格。

回想上面的场景,如果将带有+号的base64字符串,原封不动的封装到data=中,再发送给Tomcat等Web服务器,若Tomcat侧做一次urldecode解码,+是不是就变成空格了。

3、问题解决

解决方法就是对Base64编码后的参数,进行urlencode编码,示例代码如下:

public static void main(String[] args){
        try {
            String data1 = "username=张三&password=123456";
            String data2 = Base64.getEncoder().encodeToString(data1.getBytes("utf-8"));
            String requestStr = URLEncoder.encode(data2, "utf-8");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

这里做了urlencode后,+会被编码为%2B,再由服务端解码,就会变成原来的+号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值