首页 > 解决方案 > 如何在 Spring Boot 中处理 RequestParam 中的花括号

问题描述

我有一个带有 GET 服务的 Spring Boot 应用程序。

@RequestMapping(value = "/abc/track/{type}", method = RequestMethod.GET)

    public void DummFunc(                            
          @RequestParam(value="subs", required = false) String sub,
,  HttpServletResponse response) {}

value forsubs是一个编码值。

如果我将以下作为值传递给参数 subs

{%22endpoint%22:%22https://def.abc.com/tyu/send/eD3vpGNQW28:APA91bHOo8rYrV0xccdQz3okjZJG-QGrJX8LG6ahJnEUpMNfGedqi3hJxQsJx_8BMbH6oDjaSPPEXqzNWchWrGSkhuTkSdemikkys1U22Ipd7MsRw0owWbw89V2fslIVAJ6G5lkyvYuQ%22,%22expirationTime%22:null,%22keys%22:{%22p256dh%22:%22BK0pktn50CMsTQtqwdPlKlJtdFs0LFeXX14T1zgoz6QWnvSTp5dxtChnUP5P1JX0TsjcopbdPKyN31HfABMUyic%22,%22auth%22:%22qbO_z0vGao9wD-E5g8VU-A%22}}

它无法捕获请求并且控制不在函数内部。

如果我们改为将值传递给参数 subs:

%7B%22endpoint%22:%22https://def.abc.com/tyu/send/dX5q5eV7hFQ:APA91bHib-0QXrMzjatcvTR_uaIeeJK8lf6GmXUC9Jxv0Oxth-BzD4GmWnd4-YpDZv8qSFZ0eSg9mB2YkRvkc5ezdXW5KeaHjuQZfdyDxyBXjJgE-25Xbtlk37pdm8vfLk20k0k_VxW9%22,%22expirationTime%22:null,%22keys%22:%7B%22p256dh%22:%22BCCvcBLpRqp4u0auP688_MUJLsAiwWlQSn5kpyl8YVsEo_J-KpSdnhCmVIE_BhDXBcFYflPK52hqhYf3EaOCyuY%22,%22auth%22:%22iKuW_ESkCZnubWcQu_JK8w%22%7D%7D

它工作正常。

  1. 为什么会这样?第一次编码有什么问题?

  2. 由于服务器无法处理请求,因此返回 400。我需要捕获此类请求,然后通过正确编码来处理它们。有什么前进的方向?

我是 Spring boot/Spring 和 Java 本身的新手。如果我能得到一些见解,那就太好了。

另外,我可以在这里毫无问题地在线解码它们 - https://www.urldecoder.org/

编辑:基本上,有问题通过的请求有{and}而不是%7Band %7D

我的问题不是应用程序因 400 错误请求而失败,而是如何在我的应用程序中捕获此类请求,正确编码然后处理它们。

标签: javaspringspring-booturlcharacter-encoding

解决方案


spring-boot 非常关注安全性。我猜添加双引号/单引号或转义都行不通。

请通过:https ://www.rfc-editor.org/rfc/rfc1738

我认为您应该尝试手动编码{to%7B}to%7D

不安全:

由于多种原因,字符可能不安全。空格
字符是不安全的,因为
当 URL 被转录或
排版或接受文字处理程序的处理时,重要的空格可能会消失,并且可能会引入无关紧要的空格。
字符“<”和“>”是不安全的,因为它们被用作
自由文本中 URL 的分隔符;引号 (""")
在某些系统中用于分隔 URL。字符 "#" 是不安全的,应始终进行编码,因为它在万维网和其他
系统中用于将 URL 与片段/锚定分隔开可能跟随它的标识符。字符“%”是不安全的,因为它用于
其他字符的编码。
众所周知,网关和其他传输代理有时会修改
此类字符。这些字符是“{”、“}”、“|”、“”、“^”、“~”、
“[”、“]”和“`”。

所有不安全的字符必须始终在 URL 中进行编码。例如,即使在 通常不处理片段或锚标识符的系统中,
字符“#”也必须在 URL 中编码 ,因此如果将 URL 复制到另一个 使用它们的系统中,则无需更改网址编码。



推荐阅读