前言
问题场景:后端生成并返回给前端的字符串中有'+',但是前端通过 GET 请求将该参数传入后端后,'+'被替换成了' '。
一、'+'为什么被替换
GET 请求中遇到 + 被替换为空格的核心原因是:+ 是 URL 编码中的特殊字符(代表空格),当包含 + 的字符串直接作为 GET 参数传输时,浏览器/HTTP 客户端会自动将 + 解析为空格,服务器接收时就会出现替换问题——这是 URL 编码规范(RFC 3986)和 HTTP 传输的固有特性,并非代码错误,而是参数传输格式不符合规范导致的。
1.1 URL 编码(Percent-Encoding)的核心规则
URL 只能包含「字母、数字、- _ . ~」等安全字符,其他字符(如 /、+、=、& 等)属于「保留字符」或「不安全字符」,必须通过 %+十六进制 ASCII 码 编码后传输:
空格的 URL 编码是 %20,但早期为了简化,也常用 + 表示空格(这是 application/x-www-form-urlencoded 格式的约定);+ 本身的 ASCII 码是 43,对应的 URL 编码是 %2B
1.2 GET 请求中 + 被替换为空格的完整流程
原始字符串:...ec+khJ1Qh...
↓ 浏览器/HTTP 客户端(如 OkHttp、HttpClient)自动解析
识别 `+` 为 URL 中的「空格占位符」
↓ 传输到服务器
服务器接收参数时,将 `+` 解码为空格 → ...ec khJ1Qh...
1.3 为什么 Base64 密文容易出现这个问题?
当传输的参数是 Base64 编码的密文,而 Base64 编码的字符集包含 +、/、= 三个特殊字符:
+:对应 URL 中的空格; /:URL 中的路径分隔符; =:URL 参数中的键值对分隔符; 这三个字符直接放在 GET 参数中都会被篡改,其中 + 是最容易触发的问题。
二、怎么处理
2.1 使用 URL 安全编码
使用 JDK 自带 java.net.URLEncoder 类,可直接实现标准 URL 编码(注意字符集必须用 UTF-8),通过 URLEncoder.encode(content, StandardCharsets.UTF_8); 进行编码
代码如下(示例):
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
/**
* URL 编码工具类(标准 URLEncode)
*/
public class UrlEncodeUtil {
/**
* 标准 URL 编码(适配 GET 参数)
* @param content 待编码内容(如 Base64 密文)
* @return 编码后的字符串
*/
public static String encode(String content) {
if (content == null || content.trim().isEmpty()) {
return "";
}
// 关键:字符集必须用 UTF-8,且编码空格为 %20(而非 +)
URLEncoder.encode(content, StandardCharsets.UTF_8);
}
String {
(encodedContent == || encodedContent.trim().isEmpty()) {
;
}
{
java.net.URLDecoder.decode(encodedContent, StandardCharsets.UTF_8);
} (Exception e) {
(, e);
}
}
}

