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

本文介绍了一个在使用BASE64加密POST数据时遇到的问题及解决方案。作者在调用第三方接口过程中,因使用sun.misc.BASE64Encoder进行加密而导致URL非法字符异常。通过更换为其他库如com.sun.org.apache.xerces.internal.impl.dv.util.Base64或org.apache.commons.codec.binary.Base64,问题得以解决。
部署运行你感兴趣的模型镜像



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

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


结束语


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

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


您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们正在处理一个在JMeter中出现的异常:`java.net.MalformedURLException: Illegal character found in host: '/'`。根据提供的引用,我们可以分析原因并提供解决方案。 ### 问题分析 1. **异常含义**:该异常表明在主机名(host)中发现了非法字符'/'。在URL中,主机名(域名或IP地址)部分不允许包含斜杠(/),因为斜杠用于分隔主机名和路径部分[^1][^2][^3]。 2. **常见原因**: - **错误地将路径部分包含在主机名中**:在JMeter的HTTP请求配置中,可能将整个URL(包括路径)错误地填写在了“Server Name or IP”字段(即主机名字段)中,而不是将路径部分放在“Path”字段中[^3]。 - **URL格式错误**:在构造URL时,可能由于拼接错误导致主机名中混入了斜杠或其他非法字符[^4]。 ### 解决方案 #### 步骤1:检查JMeter中的HTTP请求配置 1. **打开JMeter测试计划**: - 找到报错的HTTP请求采样器(Sampler)。 2. **检查“Web Server”配置**: - **Server Name or IP**:该字段应只包含域名或IP地址(如`www.example.com`或`192.168.1.1`),**不能包含任何路径(如`/api`)或斜杠(/)**。 - **Port Number**:端口号(如80或443)。 - **Protocol**:协议(如HTTP或HTTPS)。 3. **检查“Path”字段**: - 所有路径部分(如`/login`或`/api/v1/users`)应填写在“Path”字段中。确保路径以斜杠(/)开头,但不要包含主机名。 - 如果路径包含查询参数(如`?id=123`),也应放在“Path”字段中(例如:`/api/v1/users?id=123`)。 #### 步骤2:验证HTTP请求默认值(如果使用) - 如果在测试计划中使用了“HTTP Request Defaults”配置元件,同样需要检查其中的“Server Name or IP”和“Path”字段,确保没有将路径错误地填入主机名字段[^3]。 #### 步骤3:检查URL拼接逻辑 - 如果在JMeter中使用变量或脚本动态生成URL,请确保拼接后的URL格式正确: - 正确格式:`协议://主机名:端口/路径?查询参数` - 示例:`http://www.example.com:8080/api/login` - 使用JMeter的调试采样器(Debug Sampler)或查看结果树(View Results Tree)检查实际请求的URL,确认主机名部分是否包含非法字符。 #### 步骤4:修复并重新测试 - 根据上述检查结果,修正配置: - **错误示例**:在“Server Name or IP”中填写`www.example.com/api` ❌ - **正确示例**: - Server Name or IP: `www.example.com` - Path: `/api/login` ✅ - 重新运行测试,确认问题解决。 ### 示例配置 下图展示了JMeter中HTTP请求采样器的正确配置方式: 1. **Protocol**: `http` 2. **Server Name or IP**: `example.com` 3. **Port Number**: `80` 4. **Path**: `/v1/login` ### 预防措施 1. **使用HTTP请求默认值**:为同一主机的多个请求设置公共的主机名和端口,避免重复输入错误。 2. **启用URL编码**:对于路径中的特殊字符(如空格、中文),勾选采样器的“Encode?”选项。 3. **日志监控**:在JMeter中启用详细日志(修改`jmeter.log`级别为`DEBUG`),实时捕获URL构造问题。 ### 错误配置与修复对照表 | 配置项 | 错误示例 | 正确示例 | |----------------|--------------------------|----------------------| | Server/IP | `example.com/api` | `example.com` | | Port | 空(未填写) | `80`(根据协议填写) | | Path | `login`(缺少起始斜杠) | `/api/login` | ### 总结 该异常的根本原因是**将路径部分错误地填入主机名字段**,导致JMeter解析URL时发现主机名包含非法字符'/'。通过分离主机名和路径即可解决[^3]。若问题仍存在,请检查URL动态生成逻辑或网络代理设置。 §§相关问题§§ 1. 如何在JMeter中正确配置HTTP请求的路径参数? 2. JMeter测试中如何处理URL中的特殊字符? 3. 如何调试JMeter脚本中的网络连接错误? [^1]: Non HTTP response code: java.net.MalformedURLException - Non HTTP response message: Illegal character found in host: '/' [^2]: JMeter调用webservice接口报错:java.net.MalformedURLException: Illegal character found in host: ‘/ [^3]: 问题描述 Darren洋最近在用Jenkins+ant+jmeter编写接口自动化脚本的时候,发现了jenkins发出以下报错: Non HTTP response code: java.net.MalformedURLException - Non HTTP response message: Illegal character found in host: '/' 翻译过来为: 非HTTP响应代码:java.net.MorformedURLException-非HTTP响应消息:在主机中发现非法字符:“/” 解决办法 这个问题的产生原由就是因为你在jmeter中编写的接口脚本里面的http请求默认值里面把server/IP里面的域名后又加上了接口路径,这个是不被允许的,域名后面的路径应该从中转移到http请求中的path路径中。完成上述操作,此问题得到圆满解决。 [^4]: 已解决java.net.MalformedURLException异常的正确解决方法,亲测有效!!!</think>### 解决 `java.net.MalformedURLException: Illegal character found in host` 错误 该错误表示在主机名(host)中发现了非法字符 `/`,这是 URL 格式规范不允许的。根据引用内容,以下是完整解决方案: #### 错误原因分析 1. **URL 格式错误**(最常见原因) - 在 JMeter 的 `Server Name or IP` 字段中错误地包含了路径部分(如 `example.com/api`),导致主机名被解析为 `example.com/api`(包含非法字符 `/`)[^3] - 正确的主机名格式应为纯域名或 IP:`example.com` 或 `192.168.1.1` 2. **协议标识缺失** - 缺少协议前缀(如 `http://` 或 `https://`),导致解析失败[^4] 3. **特殊字符未编码** - 路径中包含未编码的特殊字符(如空格、中文等) #### 解决方案步骤 ##### 1. 修正 JMeter 的 HTTP 请求配置 ```diff HTTP Request Sampler: - Server Name or IP: example.com/api ❌ + Server Name or IP: example.com ✅ - Path: () ❌ + Path: /api ✅ ``` - 在 JMeter 的 HTTP 请求中: - `Server Name or IP` 字段 **只填域名/IP**(如 `api.example.com`) - 所有路径部分移到 `Path` 字段(如 `/v1/login`)[^3] - 如果使用 **HTTP Request Defaults**: - 同样确保 `Server Name` 不包含路径 ##### 2. 添加协议前缀 - 在 `Protocol` 字段明确指定协议: ```diff - Protocol: [空] + Protocol: https ✅ ``` - 或直接在 `Path` 字段包含完整路径: ```diff - Path: api/v1 + Path: https://example.com/api/v1 ✅ ``` ##### 3. 编码特殊字符 - 对于路径中的特殊字符: ```diff - Path: /search?q=测试 ❌ + Path: /search?q=%E6%B5%8B%E8%AF%95 ✅ (URL编码) ``` - 在 JMeter 中勾选 **Encode?** 选项自动编码参数 ##### 4. 验证 URL 格式 - 最终 URL 应符合标准格式: ``` 协议://主机名:端口/路径?参数 ↑ ↑ ↑ ↑ http example.com /api/login ``` #### 调试技巧 1. 使用 **View Results Tree** 组件检查实际请求的 URL 2. 在 `Path` 字段使用 `${__urlencode(原始路径)}` 函数自动编码 3. 检查是否有前置处理器错误修改了 URL #### 配置正确示例 ```java // 正确配置 HTTP Request Sampler: Protocol: https Server: api.example.com // 纯主机名 Port: 443 Path: /v2/users/login?token=ABC // 路径和参数在此 ``` > 此问题在引用[3]中明确说明:*"域名后面的路径应该从中转移到http请求中的path路径中"*[^3]。 #### 预防措施 1. 使用 **HTTP Request Defaults** 统一配置主机名 2. 在路径中使用 JMeter 变量时添加校验: ```java Path: ${__urlencode(${apiPath})} ``` 3. 避免在参数值中直接使用未编码的特殊字符
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值