base64加密放入URL引发的问题解决,java.net.MalformedURLException:Illegal character in URL

本文介绍了解决使用Base64编码后导致URL非法字符错误的问题,对比了不同Base64实现方式,并推荐了一种适合URL场景的Base64编码方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在做跟另一个系统的同步用户接口时,接口使用base64转换完之后的字符串加入到url中,总是报java.net.MalformedURLException:Illegalcharacter in URL.

用转义字符转换了也不行。

后来发现是引用的base64jar包的问题。

应该引用

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

加密方法:
String url = "/shopping/confirm.action?id=1&name=itzhai";
String code = Base64.encode(url.getBytes());
而我开始使用的方法是:
import sun.misc.BASE64Encoder;
BASE64Encoder().encode(url.getBytes());
后来了解到:
1.sun.misc包是Sun公司提供给内部使用的专用API,在java API文档中我们看不到任何有关BASE64影子,不建议使用。
2.Apache还提供了,非标准的实现方式:
1.不再添加回车符。


2.Url Base64,也就是将“+”和“\”换成了“-”和“_”符号,且不适用补位。
<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. 避免在参数值中直接使用未编码的特殊字符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值