缘由:

在一个项目中,app请求tcpdump日志与记录的日志内容不一致

请求%2B 识别成 +

请求 + 识别成 空格

这个在base64解密的时候会出现异常,base64需要的是加号,而不是空格

造成的原因:

在js中,对url的加密分别由三种方式:

escape("aa+aa aa")
"aa+aa%20aa" encodeURI("aa+aa aa")
"aa+aa%20aa" encodeURIComponent("aa+aa aa")
"aa%2Baa%20aa"

第三种方式,+变成%2B

java代码:

System.out.println(URLEncoder.encode("aa+aa aa","UTF-8"));
aa%2Baa+aa

特么加号变成%2B,空格变成加号

如果是没经过加密,但是解密了

System.out.println(URLDecoder.decode("aa+aa aa","UTF-8"));
aa aa aa

好吧,从这里就可以看出,为什么base64解密报错了

app端进行base64加密,内部含有+,然后并没有进行url加密,直接传给后端,后端对其先进行Url解密,+变成了空格,再进行base64解密,所以报错。

规范:

造成这种混乱局面的原因在于:

W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要用加号+替代,所以几乎所有使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。

而在另一份规范(RFC 2396,定义URI)里, URI里的保留字符都需转义成%HH格式(Section 3.4 Query Component),因此空格会被编码成%20,加号+本身也作为保留字而被编成%2B,对于某些遵循RFC 2396标准的应用来说,它可能不接受查询字符串中出现加号+,认为它是非法字符。所以一个安全的举措是URL中统一使用%20来编码空格字符。

Java中的URLEncoder本意是用来把字符串编码成application/x-www-form-urlencoded MIME格式字符串,也就是说仅仅适用于URL中的查询字符串部分,但是URLEncoder经常被用来对URL的其他部分编码,它的encode方法会把空格编成加号+,与之对应的是,URLDecoder的decode方法会把加号+和%20都解码为空格,这种违反直觉的做法造成了当初我对空格URL编码问题的困扰。

因此后来我的做法都是,在调用URLEncoder.encode对URL进行编码后(所有加号+已被编码成%2B),再调用replaceAll(“+”, “%20″),将所有加号+替换为%20。

参考:

[故障引起的故事]URL中带加号的处理

字符解码时加号解码为空格问题探究

URL中关于空格的编码转换成+或转换成%20的问题

Base64 空格,加号问题的更多相关文章

  1. [Android Pro] http请求中传输base64出现加号变空格的解决办法

    reference to : http://blog.csdn.net/jsjwbxzy/article/details/45970231 try { des = URLEncoder.encode( ...

  2. php处理url的rawurlencode:可处理空格加号

    (PHP 4, PHP 5, PHP 7) rawurlencode - 按照 RFC 3986 对 URL 进行编码 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号( ...

  3. printf详解

    用了这么多年c了,今天想编个小程序练练手,忽然发现对于printf这个函数并不甚了解.上网查了查,下面是对printf()的详解: 函数原型: #include <stdio.h> int ...

  4. javascript基础(完整)

    一.什么是javascript? 是一种基于对象和事件驱动(以事件驱动的方式直接对客户端的输入做出响应,无需经过服务器端)并具有安全性能的解释型脚本语言,在web应用中得到非常广泛地应用.它不需要编译 ...

  5. [19/06/05-星期三] CSS基础_样式表的位置(内联、内部、外部样式)、块元素(div)、内联元素(span)、常用的选择器

    一.概念 CSS(Cascading Style Sheets,层叠样式表) 可以用来为网页创建样式表,通过样式表可以对网页进行装饰. 所谓层叠,就是可以将整个网页想象成是一层一层的结构,层次高的将会 ...

  6. HGAME 2020 week1 web

    1.Cosmos 的博客 知识点:git source code leak 2.接 头 霸 王 Description HGAME Re:Dive 开服啦~ 打开题目,提示了"头" ...

  7. Typora第一次使用

    一级标题 二级标题 三级标题 三个# + 空格 分割线 三个- 三个* 粗体 ctrl + B 斜体 ctrl + I 删除线 引用 一个大于号就可以了 图片: ! + [] + (图片路径) 超链接 ...

  8. C# base64图片数据传送加号(+)变空格问题

    今天遇到一个问题,将图片的base64数据转发,客户收到base64数据后生成图片失真. 通过日志监控,对比客户收到的数据和我发出的数据,最终发现客户base64数据中原本应该显示为加号(" ...

  9. 纠结的一天 —— 由base64编解码与加号、空格引起

    2014年3月14日,星期五, 23点22分 忙碌.焦头烂额.充实而又幸福的一天! 写在篇头的话: 许多时候,别人分享的经验(成功或失败),个中滋味,听者很难真正体会,直到自己遇到的那一瞬间,才会泪如 ...

随机推荐

  1. RE:从零开始的莫比乌斯反演

    炫酷反演魔术根本看不懂啊...也就看看PoPoQQQ的ppt了. 这个赛季结束了,一年可以学很多很多东西呢. 因为我是写给自己看的所以写的很垃圾. 公式: 按我的理解,反演就是  x可以表示成y,然后 ...

  2. axios 中断请求

    1 <button onclick="test()">click me</button> <script src="https://unpk ...

  3. css文字上下居中,一行文字居中,两行或多行文字同样居中

    附图: 1. 利用Flex布局实现 demo.html <div class="demo demo-flex"><span>孤云将野鹤,岂向人间住.莫买沃洲 ...

  4. eclipse哪个版本好

    Eclipse IDE for Java EE Developers (企业级开发软件,干啥都足够了,300MB左右)

  5. 用TreeSet生成不重复自动排序随机数组

    随机数组就是在指定长度的数组中用随机数字为每个元素赋值,常用于不确定数值的环境,如拼图游戏需要随机数组来打乱图片顺序.可是同时也存在问题,就是随机数的重复问题,这个问题常常被忽略. TreeSet类的 ...

  6. Background removal with deep learning

    [原文链接] Background removal with deep learning   This post describes our work and research on the gree ...

  7. CVE-2017-8912 CMS Made Simple命令执行

    CVE-2017-8912 CMS Made Simple命令执行 1)了解命令执行漏洞,并且能够从源码中发现. 2)用eval处理函数,并且过滤不严导致命令执行. 实验步骤 1.1)登录网站 1.2 ...

  8. C++中类型(理解)

    long long类型 转载:https://blog.csdn.net/junecau/article/details/6766033 在做ACM题时, 经常都会遇到一些比较大的整数.而常用的内置整 ...

  9. 20144306《网络对抗》MAL_恶意代码分析

    一.基础问题 1.如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控? 使用Windows自带的schtasks指 ...

  10. JDBC事务(二)转账示例

    示例采用三层框架 web层: package cn.sasa.web; import java.io.IOException; import javax.servlet.ServletExceptio ...