• base64码通过http传输 +号变 空格 问题解决


    通过七牛云base64上传图片,通过官方示例上传成功后,根据示例改了一个controller。

    通过前端往后端传base64码形式进行测试。死活不通过,七牛报400。

    仔细排查后发现,示例转换的base64码与前端传来的base64码稍有区别,

    前端通过post传入的base64码将 “+”  号改成了  空格 。


    网上解决方案

    前台处理 :java方法:URLEncoder.encode(str,"UTF-8");js 方法encodeURIComponent(str);

    后台处理:URLDecoder.decode(str,"UTF-8");


    经测试,编码形式 会改变一些其他字符,例如 “=”变成了“%3D”


    解决方案。

    一、JAVA 后端对字符串进行替换

    url = url.replaceAll(" ","+");

    经过测试,成功。


    或者是,前端通过请求头方式去控制。


    • base64加密参数Http传输

    base64中,加号(+)是base64编码的一部分,如果将+号转变为空格,就会导致解密失败。

    现在应该很清楚为什么base64后,通过http请求后,数据丢失的原因了吧。

    1、Base64加密后的数据:

    gLi5lSf1FW+r1nuhjheOlA2vYlbt1U9kOKnGPPG/LZU+J7qlqUSckCtGfRiQkkqgfZHwEGaBZkpGWuIyZ+tCegU8xj85Xp7bG3Fyfd6k=

    在对Base64加密进行http传输时,后台收到的数据会出现空格的现象。如下

    gLi5lSf1FW r1nuhjheOlA2vYlbt1U9kOKnGPPG/LZU J7qlqUSckCtGfRiQkkqgfZHwEGaBZkpGWuIyZ tCegU8xj85Xp7bG3Fyfd6k=

    这就导致传输的数据和接收的数据不一致,导致解密失败

    2、base64 http请求,如何将+号进行urlEncode

    设置http请求头(对参数进行urlEncode操作) 
    Content-Type: application/x-www-form-urlencoded

    3、Base64 urlEncode后:

    gLi5lSf1FW%2r1nuhjheOlA2vYlbt1U9kOKnGPPG/LZU%2J7qlqUSckCtGfRiQkkqgfZHwEGaBZkpGWuIyZ%2tCegU8xj85Xp7bG3Fyfd6k=

    4、后台接收的数据:

    gLi5lSf1FW+r1nuhjheOlA2vYlbt1U9kOKnGPPG/LZU+J7qlqUSckCtGfRiQkkqgfZHwEGaBZkpGWuIyZ+tCegU8xj85Xp7bG3Fyfd6k=

    这时,接收的base64数据和传输的是结果一致,可以正常解密了。

    • 什么是:application/x-www-form-urlencoded

    简单的讲就是form表单提交。 
    浏览器会对form表单的数据进行url编码,把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url

    如果表单有加号(+),url编码后会变为%2,这时后接收数据后,对参数解码后转变为+号 
    如果表单有空格,url编码后会变为+,后台接收数据化,解码变为空格

    2018-11-29更新

    今天协助公司程序对接XXX仕支付公司的支付接口出现了这个问题,需要他们协助解决,加密报文中有Base64加密成的“+”号http换成了空格,结果对方也不同意协助,做个记录吧

  • 相关阅读:
    vsftpd被动模式配置
    CentOS 6.4 服务器版安装教程(超级详细图解)
    CentOS 5.4 安装和卸载桌面
    CentOS 删除桌面环境
    centos x64 vsftpd 530登陆错误问题
    [CentOS] CentOS for vsftpd with MySQL Virtual user
    vsftp 无法启动,500 OOPS: bad bool value in config file for: anonymous_enable
    第二章 创建对话框
    error: no matching function for call to 'Ui::GoToCellDialog::setupUi(QDialog*&)' ui.setupUi(dialog); ^
    第一章 Qt入门
  • 原文地址:https://www.cnblogs.com/jpfss/p/10037984.html
Copyright © 2020-2023  润新知