昨天在做一个 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;

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

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



结束语


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

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


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

  1. java.net.MalformedURLException: Illegal character in URL

    在进行接口测试时,意外发现返回结果报java.net.MalformedURLException: Illegal character in URL,意思是“在URL中的非法字符”,我的参数是经过ba ...

  2. django删除表重建&修改用户密码&base64加密解密字符串&ps aux参数说明&各种Error例子

    1.django的queryset不支持负索引 AssertionError: Negative indexing is not supported. 2.django向前端JavaScript传递列 ...

  3. python中的base64加密解密

    介绍 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RFC2049,上面有MIME的详细规范. ...

  4. android与php使用base64加密的字符串结果不一样解决方法

    base64将字符串转换为字节得到同一个值 一.错误 String signString = Base64.encodeToString(signContent.getBytes(),Base64.N ...

  5. 爬取数据时解析url时一直报错Caused by: java.net.URISyntaxException: Illegal character in query at index 823替换了所有空格和特殊字符还是无效

    近日在用HttpClient访问抓取汇率时,为了省力,直接采用 String url = "http://api.liqwei.com/currency/?exchange=usd|cny& ...

  6. js中变量base64加密传输

    首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01 ...

  7. .NET中进行Base64加密解密

    方法一: /// <summary> /// Base64加密 /// </summary> /// <param name="Message"> ...

  8. Java中使用BASE64加密&解密

    package com.bao.tools.encryption; import java.io.IOException; import org.junit.Test; import sun.misc ...

  9. Jmeter中实现base64加密

    Jmeter已不再提供内置base64加密函数,遇到base64加密需求,需要通过beanshell实现 直接上beanshell代码: import org.apache.commons.net.u ...

随机推荐

  1. WPF中图形表示语法详解(Path之Data属性语法)

    原文 http://blog.csdn.net/johnsuna/article/details/1885597 老规矩,看图说话. 先看显示效果:(图1) XAML(代码A):<Page xm ...

  2. aix 小机运维

    zzbank 一个月折腾总结小总结:#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++#+    Ruiy-ge;#+#+    Te ...

  3. zoj2588 Burning Bridges(无向图的桥)

    题目请戳这里 题目大意:给一张无向图,现在要去掉一些边,使图仍然连通,求不能去掉的边. 题目分析:就是求无向图的桥. tarjan算法跑一遍,和无向图割点十分类似,这里要找low[v] > df ...

  4. Oracle 基础查询知识点

    1.Oracle 别名 如果非固定格式的列名可以如此 select last_name as name from employees 如果想显示固定格式的别名的话,则别名必须使用"" ...

  5. c++策略模式

    这几天需要学习一下设计模式来为设计代码结构使得代码可扩展性强,代码更加易于维护,不用想很长时间也不知道怎么去设计一个工具的代码. 我的理解策略模式: 1.有一个策略基类,策略类是什么呢?策略类就是一个 ...

  6. Pods 更新后提示Bundle资源找不到

    http://www.oschina.net/question/101347_2159145

  7. 服务器:RAID、AHCI、IDE

    RAID 独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方(因此,冗余地)的方法.通过把数据放在多个硬盘上 ...

  8. 从头开始-01.C语言环境测试

    在Mac下编写C程序需要以下几步: 编写代码 a>编译:把C语言编译成0和1 b>工具:clang编译器 c>指令:cc -c 文件名.c      编译成功会生成一个. o目标文件 ...

  9. 关于css3中before与after用单冒号还是双冒号的疑虑

    在 CSS3 中为了区别伪元素和伪类为伪元素使用了双冒号,因此如果使用了 display 或者 width 等属性时使得显示脱离了原本元素后,建议按照标准双写.

  10. spring加载jar包中多个配置文件

    转自:http://www.cnblogs.com/GarfieldTom/p/3723915.html <import resource="classpath*:applicatio ...