【问题标题】:Is there a way to prevent Spring Cloud Gateway from reordering query parameters?有没有办法防止 Spring Cloud Gateway 重新排序查询参数?
【发布时间】:2019-11-10 18:40:08
【问题描述】:

Spring Cloud Gateway 似乎正在重新排序我的查询参数以将重复的参数放在一起。

我正在尝试将一些请求路由到我们的某个端点到第三方系统。这些请求包括一些查询参数需要按特定顺序排列(包括一些重复的参数),或者第三方系统返回 500 错误,但是在接收到具有正确顺序的参数的初始请求后,Spring Cloud Gateway 会重新排序这些参数通过参数的第一个实例将重复项放在一起。

例子:

http://some-url.com/a/path/here?foo=bar&anotherParam=paramValue2&aThirdParam=paramValue3&foo=bar

变成:

http://some-url.com/a/path/here?foo=bar&foo=bar&anotherParam=paramValue2&aThirdParam=paramValue3

最后一个参数被第一个参数移动到的位置,因为它们具有相同的名称。

我需要的实际请求输出是查询参数无需更改即可传递。

【问题讨论】:

  • 不确定。你用的是什么版本?你有任何查询参数过滤器吗?
  • 我们使用的是 Spring Boot 2.1.1。我在没有查询参数过滤器的情况下进行了测试,但重新排序仍然发生。
  • @spencergibb 您认为自定义过滤器工厂能够更改查询参数吗?如果我们无法避免重新排序,我可以通过这种方式找到解决方法。
  • 可能。我不知道是什么导致了重新排序。

标签: spring-cloud spring-cloud-gateway


【解决方案1】:

问题在于UriComponentsBuilder 中使用的RouteToRequestFilterUriComponentsBuilder.fromUri(uri) 将建立一个查询参数映射。因为这是一个LinkedMultiValueMap,所以您会看到使用的查询参数的重新排序。

请注意,RFC3986 包含以下内容

查询组件包含非分层数据,这些数据与路径组件(第 3.3 节)中的数据一起用于标识 URI 方案和命名权限(如果有)范围内的资源。

因此,我认为 Spring Cloud Gateway 中不需要修复。

为了在您的网关中解决此问题,您需要添加一个自定义过滤器,该过滤器在RouteToRequestFilter 之后通过将顺序设置为RouteToRequestUrlFilter.ROUTE_TO_URL_FILTER_ORDER + 1 来启动。 看看RouteToRequestUrlFilter是如何适配exchange去下游URI的。

希望对您有所帮助! :)

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2016-11-25
    • 2016-12-12
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2019-02-15
    • 2013-11-16
    • 2020-10-10
    相关资源
    最近更新 更多