URL中加入BASE64加密的字符串引起的问题(java.net.MalformedURLException:Illegal character in URL)

昨天在做一个 Demo 的时候,由于是调用第三方的接口,采用的是 HTTP 的通信协议,按照文档上的说明,需要把参数进行加密后加入到 URL 中,但是,就是这个看似普普通通的操作,却让我着实费了很大的劲。

背景

关于 BASE64,我不想说太多,因为这是很基本的一种编码方式,或者说是加密方式。不了解的可以到我前面的博客中去看看,关于加密,前边有一个系列的文章。下面说说出现这个问题的情景。

昨天拿到一个任务,写一个 Demo,目的是查询一系列的信息,当然,需要调用一个第三方的接口,根据接口文档中的说明,该接口采用的是 HTTP 协议,Post 的数据需要进行 BASE64 加密,由于我之前自己封装了一系列的加密算法,因此,就直接拿过来用了。这里先说明一下,在我封装的加密算法中,用到的是 sun 的 BASE64Encoder,也就是说,我引入的是这个类:

import sun.misc.BASE64Encoder;

这里看不出有什么问题,请接着看下边。

出现的问题

就这样,每当测试的时候,程序总是会报同一个错误 —— (java.net.MalformedURLException:Illegal character in URL),刚开始的时候,我还以为是自己写的 模拟 Post 提交的代码有问题呢,于是网上查了又查,最后发现没有什么问题。于是,排除了这一块,就开始找别的原因。什么百度、Google 都查遍了,问题也没有解决,当初也没有想到是
BASE64 加密的问题。因为之前一直在用,也没有出现什么错误。

这个问题从中午一直持续到了下班之前,记得还是下午 5 点多的时候,终于从网上发现一篇文章,好像也是遇到了同样的问题,从他的文章中找到了原因。

解决方案

之所以出现这样的问题,是由于在 BASE64 加密的过程中,引错了 jar 包,不应该使用 Sun 提供的内部包,也就是 sun.misc,后来了解到 sun.misc 包是 Sun 公司提供给内部使用的专用 API,在 java API 文档中我们看不到任何有关 BASE64 影子,不建议使用。

经过测试,我发现,除了使用 sun.misc 包的 BASE64 报错外,其他两个都可以正常运行,这两个包括:

  • com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
  • org.apache.commons.codec.binary.Base64;

这两个提供的实现都可以正常运行。至于这两个的加密方法嘛,百度一下下吧。。。

结束语

通过这个问题,我发现,很多时候,我们往往忽略一些看似很没用的东西,而正是这些没用的东西,时不时的会在我们的路途中横上一杠子,我想说的是,尽管会出现这样那样的问题,还是要耐着性子去解决,不要把问题留给以后。

而且,当我们在学习某一类知识的时候,如果有时间,可以多想想,涉及一下与其相关的知识,或许你会有意想不到的收获。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 02:13:18

URL中加入BASE64加密的字符串引起的问题(java.net.MalformedURLException:Illegal character in URL)的相关文章

python中的base64加密解密

介绍 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RFC2049,上面有MIME的详细规范. Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息.采用Base64编码具有不可读性,需要解码后才能阅读. Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各

javaScript base64算法的实现 与 java中的base64 加密 解密

前段时间,工作需要,需要用js和java配套的base64算法,奈何没找到,然后网上抄一套.用起来还是很有效的. 闲言少絮,直接上干货. js 版base 64 算法  base64.js var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; //将Ansi编码的字符串进行Base64编码 function encode64(input) { var output = &quo

.NET中进行Base64加密解密

方法一: /// <summary> /// Base64加密 /// </summary> /// <param name="Message"></param> /// <returns></returns> public string Base64Code(string Message) { byte[] bytes = Encoding.Default.GetBytes(Message); return Co

js中变量base64加密传输

首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode : function(e) { var t = ""; var n, r, i, s, o, u, a; var f = 0; e = Base64._utf8_encode(e); while (f < e.length) { n

Java中使用BASE64加密&amp;解密

package com.bao.tools.encryption; import java.io.IOException; import org.junit.Test; import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; /** * @title BASE64加密&解密 * @description * 邮件,HTTP协议,一般用户名及密码 * @author Administrator * @date 2015-7-16 *

js中实现base64加密、解密

//1.加密解密方法使用: //1.加密 var str = '124中文内容'; var base = new Base64(); var result = base.encode(str); //document.write(result); //2.解密 var result2 = base.decode(result); document.write(result2); //2.加密.解密算法封装: function Base64() { // private property _key

javascript对URL中的参数进行简单加密处理

javascript的api本来就支持Base64,因此我们可以很方便的来进行编码和解码. var encodeData = window.btoa("name=xiaoming&age=10")//编码 var decodeData = window.atob(encodeData)//解码. 下面来个具体的例子来说明如何对url中参数进行转码,并取得解码后的参数 假如要跳转的url = "stu_info.html?name=xiaoming&age=10

字符串base64加密、解密

//base64加密(字符串经过base64加密之后得到的新的字符串)NSData *data = [@"iOS Developer Tips" dataUsingEncoding:NSUTF8StringEncoding]; NSString *base64Encoded = [data base64EncodedStringWithOptions:0]; //base64解密(base64加密的字符串经过base64解密之后得到的新的字符串) NSData *nsdataDecod

Base64 加密之中文乱码

ase64编码将二进制数据按照每三个字节转换成四个字节可读字符,编码后的字符长度大约为136.1%.字符范围为 A-Z  a-z  0-9  \  +.但编码后的字符串不太适合使用URL传输,中文加密后的乱码也多是因为这个原因引起:放在url中传输时+号会被替换成空格:并且每76个字符都会添加一个换行"\n",这个换行符合会丢失. 例如: 哈哈哈哈哈哈.... 哈哈哈哈哈哈.... 哈哈哈哈哈哈.... 会被编码为: uf65/rn+uf65/rn+oaOho6GjDQoNCrn+uf