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;

这两个提供的实现都能够正常执行。

至于这两个的加密方法嘛。百度一下下吧。。



结束语


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

并且,当我们在学习某一类知识的时候,假设有时间,能够多想想,涉及一下与其相关的知识。也许你会有意想不到的收获。


原文地址:https://www.cnblogs.com/blfshiye/p/5146120.html