特殊字符的url编码

今天用postman测试一个url,传参 toekn:abcder/+fjaogjear 服务端接受时,发现token被解析成了abcder/ fjaogjear  参数中的+被解析成了空格。

细看发现忘记了特殊字符在url中的编码。

为什么 + 被替换为空格?

  1. URL 编码规则

    • 在 URL 中,空格( )通常会被编码为 %20,而在 查询字符串(即 URL 的 ? 后面部分)中,空格会被特别处理为 +
    • 这是因为在 查询字符串 中,+ 是空格的替代符号。这是 URL 编码 的标准行为。具体来说,+ 表示空格,而 %20 也是空格的编码形式。

    例子

    • hello world 会被编码为 hello+worldhello%20world,二者是等效的。
    • 当你在客户端传递的参数中含有 +,它会被编码为 +,而服务端解码时,会将 + 解析为空格。
  2. 客户端发送 + 但服务端解析为空格

    • 假如你在 URL 查询参数中发送了 +(例如 key=hello+world),客户端会将 + 编码为 +,服务端收到时会将其解码为 空格,因为这是 URL 编码的标准行为。
    • 如果你的意图是传递字符 + 而不是空格,+ 应该被编码为 %2B。这样,服务器在解码时就会将它识别为 +

    客户端传递的 URL

    https://example.com?key=hello+world
    

    服务端解析后:

    key = "hello world"  // 服务端将 + 转换为空格
    

    解决方案:确保传递的 + 不变为空格

  3. 在客户端使用 + 的正确编码

    • 如果你希望传递字符 + 而不是空格,你应该在发送请求时对 + 进行 百分号编码,即将 + 编码为 %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
    

  4. 服务端收到这个参数后,需要使用 URL 解码功能正确解析 %2B+。通常,现代 Web 框架(如 Java、Python、Node.js)会自动进行 URL 解码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值