由于业务需求,需要一个生成二维码的功能,生成二维码的功能用Google的jar包成功解决,并且对外提供了一个生成二维码的web接口,参数为需要跳转的url链接。后续发现一个问题,就是web端传递的url进来后,有时候生成二维码后扫描得到的链接正常,有时候就不正常,url上带的参数部分丢失了。比如qcUrl =baidu.com、qcUrl=baidu.com?param1=abc,这样的链接生成的二维码就没问题,扫描后得到的链接跟qcUrl 一致;但是qcUrl = baidu.com?param1=abc¶m2=bcd这样的参数生成的链接就有问题,扫描后得到的链接变成了baidu.com?param1=abc,后面的参数丢失了。
当时一直觉得是二维码生成有问题, 后来定位才发现问题的原因根本不是二维码生成的问题,是qcUrl = baidu.com?param1=abc¶m2=bcd这样的参数传递到后端就变成了baidu.com?param1=abc,参数已经丢失了。百度了下,原因是,当通过url传参时,遇到“&”会自动截断,把参数当成独立的参数往后端传递,比如你想传递一个参数qcUrl值为“baidu.com?param1=abc¶m2=bcd”到服务器端,这时候,url传参会将参数解析成qcUrl=baidu.com?param1=abc和param2=bcd这两个参数传递到后端。
解决方案:
1.对url中的特殊字符进行转义;
2.将整个url参数进行encode处理;
3.将url在web端进行base64转码,传递到服务器端后,进行解码。
1.url中常用的特殊符号对应的转义符号
特殊符号 | 说明 | 转义符号 |
+ | URL 中+号表示空格 | %2B |
空格 | URL中的空格可以用+号或者编码 | %20 |
/ | 分隔目录和子目录 | %2F |
? | 分隔实际的URL和参数 | %3F |
% | 指定特殊字符 | %25 |
# | 表示书签 | %23 |
& | URL 中指定的参数间的分隔符 | %26 |
= | URL 中指定参数的值 | %3D |
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "https://m.biyao.com/activity/summitMeetingBindTeam/joinTeam?it=h5-ddzdlx&inviteCode=AAAA&c=adasdfa";
String encodeS = URLEncoder.encode(s,"UTF-8");
System.out.println(encodeS);
}
输出为:
3.代码示例:
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "https://m.biyao.com/activity/summitMeetingBindTeam/joinTeam?it=h5-ddzdlx&inviteCode=AAAA&c=adasdfa";
String data = Base64.encodeBase64String(s.getBytes("UTF-8"));
System.out.println(data);
System.out.println(new String(Base64.decodeBase64(data)));
}
输出为: