关于2B的转义问题
最近碰到了一个中文乱码问题,话说是这样的:模块A调模块B的1接口,B把A带过来的用户ID加密后返回一个链接,当用户点击该链接时,A解密该用户ID后再调B的2接口。简而言之,我们用流程看下:模块A ->(1,加密userID) 模块B -> 链接 -> 模块A ->(2,解密userID) -> 模块B。问题出在链接上,模块B返回的链接里userID刚好加密完了有一个+号,经过转义+号变成了%2B,但是模块A没有按B提供的转义后的链接给用户,而是自己提供给未转义的链接(%2B又变回了+号),这时A模块从浏览器获取userID后,再解密就变成了一串乱码:d[pk 161
我们先看模块B的加密:
public static void main(String[] args) throws Exception
{
String value = "XXXXXXX";
String msisdn = "53003443161";
byte[] middleString = encrypt(msisdn, value);
byte[] arr = Base64.encodeBase64(middleString, true);
value = new String(arr, "UTF-8");
value = value.replaceAll("[\\s*\t\n\r]", "");
System.out.println(value);
//转义
value = URLEncoder.encode(value, "utf-8");
System.out.println(value);
}
秘钥我就不贴了,这里我把没转义的和转义过的都打印出来了:
thgrhWmM0+EasSHO5Ld2GQ==
thgrhWmM0%2BEasSHO5Ld2GQ%3D%3D
从上面我们可以看到+转义为%2B,=转义为%3D。我们返回出去的链接是:http://wlf.com/p/wlf.jsp?userID=thgrhWmM0%2BEasSHO5Ld2GQ%3D%3D,经过浏览器%2B会变成+,再解密userID是ok的。但人工提供的未转义链接却是长这样的:http://wlf.com/p/wlf.jsp?userID=thgrhWmM0+EasSHO5Ld2GQ%3D%3D。通过浏览器用get方式访问时,+号会被浏览器处理为空,所以userID就变成了
thgrhWmM0 EasSHO5Ld2GQ%3D%3D,中间的+号被吃了,变成了空格,再去解密自然成乱码了。
解决办法就是提供转义后的userID。
关于2B的转义问题的更多相关文章
- URL特殊字符的转义
+ 转义符为 %2B 空格 转义符为 + 或 %20 / 转义符为 %2F ? 转义符为 %3F % 转义符为 %25 # 转义符为 %23 & 转义符为 %26 = 转义符为 %3D
- SQL注入攻击和防御
部分整理... 什么是SQL注入? 简单的例子, 对于一个购物网站,可以允许搜索,price小于某值的商品 这个值用户是可以输入的,比如,100 但是对于用户,如果输入,100' OR '1'=' ...
- URL转义
在处理一些url的时候常常会出现一些让人意想不到的情况,比如:当图片的链接中有空格的时候, this.src='http://img.cits-sh.com/UploadImgs/beihaidao2 ...
- JS转义 escape()、encodeURI()、encodeURIComponent()区别详解
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...
- html特殊字符转义问题(转!)
html.javascript.url特殊字符转义在实际编程中都是有用到的,有的人对特殊字符转义的使用不是很清楚,下面就对html,javascript,url特殊字符的转义做一下说明和归纳. htm ...
- URL地址中的转义符
如果在XML里面存储URL地址可能涉及到转义符的问题 WEB开发中通过问号(?)方式在浏览器地址栏中传值时.浏览器是通过“&”来区分问号后的参数个数的. 如果出现传值参数中带有“&”时 ...
- javascript进行url转义方法比较escape、encodeURI和encodeURIComponent
escape会将除了 ASCII 字母.数字和特定的符号(* @ - _ + . /)以外的字符全部进行转义编码,因此如果想对URL编码,最好不要使用此方法,因为它会让你的URL变的不可读. 提示:E ...
- URL特殊字符需转义
URL特殊字符需转义 1.空格换成加号(+) 2.正斜杠(/)分隔目录和子目录 3.问号(?)分隔URL和查询 4.百分号(%)制定特殊字符 5.#号指定书签 6.&号分隔参数 转义字符的原因 ...
- url特殊字符转义及解决方法
URL特殊字符需转义 1.空格换成加号(+) 2.正斜杠(/)分隔目录和子目录 3.问号(?)分隔URL和查询 4.百分号(%)制定特殊字符 5.#号指定书签 6.&号分隔参数 转义字符的原因 ...
随机推荐
- js Math对象的常用方法
1,基本方法: Math.round();向上四舍五入. Math.ceil();向上取整,有小数就整数部分加1 Math.floor(5/2) ;向下取整 Math.abs();返回绝对值: Mat ...
- BZOJ 1003 [ZJOI2006]物流运输trans ★(Dijkstra + DP)
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1003 思路 先Dijkstra暴力求出i..j天内不变换路线的最少花费,然后dp[i] = ...
- Python执行Linux系统命令方法
Python执行Linux系统命令的4种方法 (1) os.system 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 复制代码代码如下: system(command) -> ...
- leetcode 720. Longest Word in Dictionary
Given a list of strings words representing an English Dictionary, find the longest word in words tha ...
- 练习-99乘法表 token生成器 翻译小工具
一.99乘法表 1.1 技术点 记住: for 循环的使用,以及for的嵌套使用 range()的使用,掌握sep为负数的使用的使用. print() 函数的使用,默认的结尾的换行符 替换 end= ...
- MySQL索引优化详解
MySQL存储引擎简介 查看命令 a. 查看所使用的MySQL现在已提供什么存储引擎: mysql> show engines; b. 查看所使用的MySQL当前默认的存储引擎: mysql&g ...
- 【hive】解析url格式字符串
解析url格式字符串 parse_url() parse_url(url_str,’xxx’):第一个参数是url格式字符串,第二个参数为要解析出来的属性 parse_url(‘http://face ...
- .NET中使用Redis:http://www.cnblogs.com/yangecnu/p/Introduct-Redis-in-DotNET.html
.NET中使用Redis Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http: ...
- c#中事务及回滚
程序一般在特殊数据的时候,会有数据上的同步,这个时候就用到了事物.闲话不多说,直接上代码. public void UpdateContactTableByDataSet(DataSet ds, st ...
- Idea_02_常用配置
一.前言 在上一节,我们安装并激活了IDEA,这一节我们来设置下Idea的常用配置: 项目相关配置 Idea常用配置 二.项目相关配置 运行Idea,出现下图 1.配置默认JDK 1.1 添加 SDK ...