java - 如何在 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
它工作正常。
为什么会这样?第一次编码有什么问题?
由于服务器无法处理请求,因此返回 400。我需要捕获此类请求,然后通过正确编码来处理它们。有什么前进的方向?
我是 Spring boot/Spring 和 Java 本身的新手。如果我能得到一些见解,那就太好了。
另外,我可以在这里毫无问题地在线解码它们 - https://www.urldecoder.org/
编辑:基本上,有问题通过的请求有{
and}
而不是%7B
and %7D
。
我的问题不是应用程序因 400 错误请求而失败,而是如何在我的应用程序中捕获此类请求,正确编码然后处理它们。
解决方案
spring-boot 非常关注安全性。我猜添加双引号/单引号或转义都行不通。
请通过:https ://www.rfc-editor.org/rfc/rfc1738
我认为您应该尝试手动编码{
to%7B
和}
to%7D
不安全:
由于多种原因,字符可能不安全。空格
字符是不安全的,因为
当 URL 被转录或
排版或接受文字处理程序的处理时,重要的空格可能会消失,并且可能会引入无关紧要的空格。
字符“<”和“>”是不安全的,因为它们被用作
自由文本中 URL 的分隔符;引号 (""")
在某些系统中用于分隔 URL。字符 "#" 是不安全的,应始终进行编码,因为它在万维网和其他
系统中用于将 URL 与片段/锚定分隔开可能跟随它的标识符。字符“%”是不安全的,因为它用于
其他字符的编码。
众所周知,网关和其他传输代理有时会修改
此类字符。这些字符是“{”、“}”、“|”、“”、“^”、“~”、
“[”、“]”和“`”。所有不安全的字符必须始终在 URL 中进行编码。例如,即使在 通常不处理片段或锚标识符的系统中,
字符“#”也必须在 URL 中编码 ,因此如果将 URL 复制到另一个 使用它们的系统中,则无需更改网址编码。
推荐阅读
- tensorflow - 使用解码器隐藏状态和编码器输出计算张量流中 Bahdanau 注意力的注意力分数
- sed - 如何使用 sed 转置单个字符
- javascript - 如何使用带有 HTML 的 Javascript 仅嵌入视频/mp4 MIME 类型
- lua - LUA 和表数据 - 在嵌套循环中查找数据
- python - 数据帧到空间并与循环缓冲区相交
- swiftui - 有没有办法在 SwiftUI 中创建 WKExtendedRuntimeSession 的新会话?
- youtube - YouTube iFrame 播放器:此视频被限制在此域上观看
- java - 了解 JPMS 模块的错误
- mysql - 来自两个表的双重联接
- bash - 得到一个?和一个 [✘?] 而不仅仅是 zsh 上的分支图标和分支名称