【问题标题】:RequestParam with special character '+'带有特殊字符“+”的 RequestParam
【发布时间】:2017-03-15 22:01:46
【问题描述】:

在我的控制器中,我有带有 4 个请求参数的 requestMapping“searchUser”。 对于请求参数“phoneNumber”,我还接受特殊字符,如 '('、')'、'-' 和 '+'。

除了字符“+”之外,所有字符都显示在我的日志中。如果我发送例如“+123”或“123+1”之类的值,我会得到我的控制器“123”和“123 1” 它将“+”替换为空格。

它只发生在 '+' 上

@RequestMapping(method = RequestMethod.GET, value = "/search", produces = "application/json")
    public List<User> getWebUserProfiles(HttpServletRequest request, HttpServletResponse response,
        @RequestParam("firstName") String firstName, @RequestParam("lastName") String lastName,
        @RequestParam("email") String email
        @RequestParam("phoneNumber") String phoneNumber);

你知道我要补充什么吗?

提前致谢!

更新:

我将 Angular 2 用于我的前端,我有一个表单,并将值进一步发送到我的 spring-boot 后端。 我的 Angular 中的 http 服务:

   search(searchParams: any){
        let params = new URLSearchParams();
        params.set('firstName', searchParams.firstName);
        params.set('lastName', searchParams.lastName);
        params.set('email', searchParams.email);
        params.set('phoneNumber', searchParams.phoneNumber);

        return this._http.get(this.baseURL+'search', 
                        { search:params })
                        .map(response => response.json())
                        .catch(this.handleError);
    }

【问题讨论】:

  • 这是因为+ 是 URL 中的特殊字符。尝试将其作为%2C 发送到您的网络服务器。
  • 这是正常的。请参阅 HTML 规范的 Form submission 部分。你是如何调用 URL 的?如果它是从浏览器中的 HTML 表单调用的,+ 应该会自动进行百分比转义。
  • @f1sh - %2C 是逗号,%2B 是加号。并为您的评论添加更多内容,plus 被视为空格的 URL 转义。少数几种方法之一。陷阱查看更多 URL 编码。
  • @Quintium 你是对的。显然很难阅读 ascii 表:D
  • @VGR 。我在我的角度前端调用它。请参阅更新

标签: java rest spring-boot special-characters


【解决方案1】:

好的,我解决了。

我将它编码在我的前端。没有其他选择。

params.set('phoneNumber', encodeURIComponent(searchParams.phoneNumber));

感谢您的帮助!

【讨论】:

  • 您应该确保您的前端 URI 编码了 all 字段。通过单独编码,或确保您的框架处理它。否则用户会得到惊喜,例如如果他们将&amp; 放入文本字​​段中。
  • 看起来不太对劲。 angular.io/docs/ts/latest/api/http/index/… 表示默认情况下它已经在进行编码。所以,显然其他事情做错了 - 可能是服务器端解码它两次或什么的。尝试查看原始流量并找出您在哪里有“+”或“”。
  • @slim 感谢您的建议。
  • @kan 真的吗?就我而言,它实际上并没有这样做。在我的 spring-boot 后端中,我对所有内容进行编码并将其提供给下一个控制器。我还尝试设置内容类型:'application/x-www-form-urlencoded'。但它不起作用
  • 我敢打赌 spring-boot 已经在幕后完成了所有的编码/解码魔法。你在 spring-boot 中究竟编码了什么,为什么?
【解决方案2】:

在发送到服务器之前,您可以简单地将 javascript 端的任何“+”实例替换为“%2B”。

Reference here

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2012-10-06
    • 2018-11-14
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多