昨天在做一个 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. 全局键盘钩子(WH_KEYBOARD)

    为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...

  2. haproxy hdr_beg 配置

    v-dev-app01:/root# ping www.zjdev.com PING www.zjdev.com (192.168.32.16) 56(84) bytes of data. 64 by ...

  3. redis.conf配置详解

    http://www.2cto.com/database/201307/225113.html

  4. const和define的区别

    1.在使用const定义常量时,只能使用标量初始化; 但我们可以使用任何表达式初始化define定义的常量 2.我们可以在条件表达式中使用define定义常量,但绝对不能使用const eg: def ...

  5. Yii国际化

    Yii版本:1.1.13 1.将CMessageSource的$forceTranslation属性改为true Yii::app()->messages->forceTranslatio ...

  6. exit函数的妙用

    写了一个程序,用来推断一个文件是否存在: #include<stdio.h> main() {  FILE *fp;  fp = fopen ("/home/wang/my/ct ...

  7. Sizzle一步步实现所有功能(一)

    前提: 1.HTML5自带querySelectAll可以完全替代Sizlle,所以我们下面写的Sizzle,是不考虑QSA的. 2.作者考虑了大量兼容情况,比如黑莓4.6系统这样几乎接触不到的bug ...

  8. JavaScript 字符串实用常用操作

    字符串截取1. substring()xString.substring(start,end)substring()是最常用到的字符串截取方法,它可以接收两个参数(参数不能为负值),分别是要截取的开始 ...

  9. nutch2.3命令参数解析

    nutch中可执行的命令列表 [root@ewanalysis ~]# nutch Usage: nutch COMMAND where COMMAND is one of: inject injec ...

  10. Java 基本日期类使用——格式化(二)

    Java日期格式化主要有以下几种方式:java.text.DateFormat以及其子类java.text.SimpleDateFormat; DateFormat 是日期/时间格式化子类的抽象类,它 ...