今天用postman测试一个url,传参 toekn:abcder/+fjaogjear 服务端接受时,发现token被解析成了abcder/ fjaogjear 参数中的+被解析成了空格。
细看发现忘记了特殊字符在url中的编码。
为什么 + 被替换为空格?
-
URL 编码规则:
- 在 URL 中,空格(
)通常会被编码为%20,而在 查询字符串(即 URL 的?后面部分)中,空格会被特别处理为+。 - 这是因为在 查询字符串 中,
+是空格的替代符号。这是 URL 编码 的标准行为。具体来说,+表示空格,而%20也是空格的编码形式。
例子:
hello world会被编码为hello+world或hello%20world,二者是等效的。- 当你在客户端传递的参数中含有
+,它会被编码为+,而服务端解码时,会将+解析为空格。
- 在 URL 中,空格(
-
客户端发送
+但服务端解析为空格:- 假如你在 URL 查询参数中发送了
+(例如key=hello+world),客户端会将+编码为+,服务端收到时会将其解码为 空格,因为这是 URL 编码的标准行为。 - 如果你的意图是传递字符
+而不是空格,+应该被编码为%2B。这样,服务器在解码时就会将它识别为+。
客户端传递的 URL:
https://example.com?key=hello+world服务端解析后:
key = "hello world" // 服务端将 + 转换为空格解决方案:确保传递的
+不变为空格 - 假如你在 URL 查询参数中发送了
-
在客户端使用
+的正确编码:- 如果你希望传递字符
+而不是空格,你应该在发送请求时对+进行 百分号编码,即将+编码为%2B。
修改客户端代码:
let param = "hello+world"; let encodedParam = encodeURIComponent(param); // 这会将 "+" 编码为 "%2B" let url = `https://example.com?key=${encodedParam}`; console.log(url); // 输出 https://example.com?key=hello%2Bworld客户端传递的 URL:
https://example.com?key=hello%2Bworld服务端正确解码 URL:
String key = URLDecoder.decode(request.getParameter("key"), StandardCharsets.UTF_8); System.out.println(key); // 输出 hello+world - 如果你希望传递字符
- 服务端收到这个参数后,需要使用 URL 解码功能正确解析
%2B为+。通常,现代 Web 框架(如 Java、Python、Node.js)会自动进行 URL 解码。
271

被折叠的 条评论
为什么被折叠?



