【发布时间】:2021-05-10 07:54:42
【问题描述】:
我们有一个在 tomcat 8.5.32 上运行的控制器,它接收带有查询参数的 POST 请求 /{path_param}/issue?title=4&description=5 请求正文为空
然后控制器将此请求重定向到带有 tomcat 9.0.27 的 Spring Boot 微服务。 在行
CloseableHttpResponse result = httpClient.execute(request);
request.getURI().getQuery()等于&title=1&description=2
但是当它到达微服务时,参数是重复的(title=[4,4]&description=[5,5])。
这是将请求重定向到微服务的代码
private static <T, U> T executePostRequest(String url, U body, HttpServletRequest httpServletRequest, Function<String, T> readValueFunction) {
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
URIBuilder uriBuilder = new URIBuilder(url);
httpServletRequest.getParameterMap().forEach((k, v) -> Arrays.stream(v).forEach(e -> uriBuilder.addParameter(k, e)));
HttpPost request = new HttpPost(uriBuilder.build());
CloseableHttpResponse result = httpClient.execute(request);
String json = EntityUtils.toString(result.getEntity(), "UTF-8");
handleResultStatus(result, json);
return readValueFunction.apply(json);
} catch (IOException | URISyntaxException e) {
...
}
}
我发现jetty 存在类似问题,并且已修复,但未找到与 tomcat 相关的任何内容 - 以及如何修复它。 我还看到this topic 提出了如何在 Spring Boot 中处理重复参数的建议,但我想知道是否有其他人遇到过同样的问题,如果是,您是如何解决的。
【问题讨论】:
-
您能否添加用于将请求转发给您的问题的代码?
-
添加了代码示例
-
您发布的代码按预期工作。也许您的系统中有其他元素(反向代理、重写阀门)与您的请求元素重复?
标签: spring-boot tomcat query-string