是否有任何情况QueryString是存在的,但HttpServletRequest.getParameterMap()



当我们在测试环境中进行压力测试时,我遇到了一个奇怪的情况。当应用程序负载高时,查询字符串偶尔会丢失,Spring会抛出MissingServletRequestParameterException。为了找到根本原因,我在最前面的Filter添加了一些日志(代码如下所示),奇怪的事情发生了。

public static void printRequestParameter(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
log.info("Request URI : {}, method = {} , query string = {}", request.getRequestURI(), request.getMethod(), request.getQueryString());
if (MapUtils.isNotEmpty(parameterMap)) {
parameterMap.forEach((k, v) -> {
log.info("Request parameter name = {}, value = {}", k, ArrayUtils.isEmpty(v) ? Strings.EMPTY : Arrays.stream(v).collect(Collectors.joining(COMMA)));
});
}
}

request.getParameterMap()是空的,但是,查询字符串不是空的,我得到了一个日志,如:

Request URI : /a/b/c, method = POST , query string = foo=bar.

但是没有像

这样的日志
Request parameter name = foo , value = bar

,我们的Controller使用@RequestParam() String foo接收参数,最后,Spring抛出

MissingServletRequestParameterException Handler org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'foo' is not present
at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:204)
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)
at org.springframework.web.method.support.InvocableH

我只是想知道,为什么查询字符串中的参数不包含在parameterMap中?注意:奇怪的行为只是偶尔发生,大多数时候它只是工作。我的spring启动版本是2.3.9.RELEASE,嵌入式tomcat版本是9.0.43

任何帮助都是感激的!

由于规范不允许ServletRequest.getParameterMap抛出任何异常,因此参数解析中的任何失败都将导致参数列表为空。

要检测这种情况,您可以记录请求的"org.apache.catalina.parameter_parse_failed_reason"属性。

应该失败的查询字符串示例:

  • ?=noname
  • ?urlEncoding=%ue

相关内容

  • 没有找到相关文章

最新更新