问题:机器特征码经过网络传输之后,‘+’都变成了‘ ’
详情:机器特征码提取了机器cpuId和mac地址信息,最后经过Base64编码后生成的字符串,一开始我使用的是
String strs = new BASE64Encoder().encode(bt);
来编码,编码后的字符串形如:Wc6zkdzzR3wd7/pcDWR3MmJdH6+bgbQoUH7w3q6zRsJVt6+I8XoBhg==
当把这个字符串通过参数的形式上传到服务器时,发现服务端收到的字符串所有的‘+’都变成了‘ ’,
如:Wc6zkdzzR3wd7/pcDWR3MmJdH6 bgbQoUH7w3q6zRsJVt6 I8XoBhg==
如何解决:一开始在服务端,强行做了字符串替换,今天早上在看Java 8新特性的时候,发现Base64其实提供了三种编解码,分别是基本,URL, MIME。
所以联想到之前的这个问题,是不是可以用URL的Encoder和Decoder来替换原来的BASE64Encoder 和 BASE64Decoder,果然,
String strs = Base64.getUrlEncoder().encodeToString(bt);
获得的机器码变成了:
Wc6zkdzzR3wd7_pcDWR3MmJdH6-bgbQoUH7w3q6zRsJVt6-I8XoBhg==
‘/’和‘+’这种不适合网络传输的字符没有了,分别被‘_’和‘-’所取代了。
只要decoder也换成对应的
Base64.Decoder decoder = Base64.getUrlDecoder();
就可以不用在服务端做丑陋的替换了。