java 你可以限制Sping Boot API来防止多个相同的查询参数吗

goucqfw6  于 2023-04-10  发布在  Java
关注(0)|答案(3)|浏览(137)

这可能是一个奇怪的请求,但我正在使用Sping Boot API,并且有一个要求,如果有人多次发送相同的查询参数,它会抛出400错误。但是,因为Spring Boot会自动将参数作为分隔列表拉入,所以我不知道如何做到这一点。
例如,如果有人发送了/my-api?foo=some%20stuff&foo=some%20more%20stuff,那么foo的结果值是“some stuff,some more stuff”。
我找不到任何关于如何验证它的文档。我想我可以在请求到达控制器之前检查它并在那里做一些工作。但我希望有一些我可以使用的配置或注解。

1mrurvl1

1mrurvl11#

没有纯粹的声明方式,但有一种简单的代码方式:

@RequestParam MultiValueMap<String, String> parameters

然后控制器方法的第一行:

if (parameters.values().stream().anyMatch(v -> v.size() > 1)) {
    // throw 400
}
o2g1uqev

o2g1uqev2#

典型的解决方案是使用ServletFilter
servlet过滤器是在每个请求之前和之后执行的一段代码,可以在其上执行额外的任务。
ServletFilters的典型用途是:

  • 记录HTTP请求
  • 防止SQL注入
  • 检测误用模式
  • 限制服务速率(例如,最大100个请求/秒)
  • 许多其他用途

ServletFilters最酷的一点是,您可以在一个地方编写代码,然后决定它应用于哪些URL。
此外,一个URL可以由多个过滤器提供服务。在这种情况下,它们以嵌套的方式处理。

v8wbuo2f

v8wbuo2f3#

您可能需要处理原始查询字符串。您可以通过接受HttpServletRequest参数来获取原始查询:

@GetMapping
EntityResponse getSomething(HttpServletRequest servletRequest) {
  String query = servletRequest.getQueryString();
  // do something with query string
  ...
}

相关问题