【问题标题】:Is there any situation QueryString is present but HttpServletRequest.getParameterMap() is empty?是否存在 QueryString 但 HttpServletRequest.getParameterMap() 为空的情况?
【发布时间】:2021-10-23 17:58:40
【问题描述】:

当我们在测试环境中进行压力测试时,我遇到了一个奇怪的情况。当应用程序负载高时,查询字符串偶尔会丢失,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 boot版本是2.3.9.RELEASE,嵌入式tomcat版本是9.0.43

感谢任何帮助!

【问题讨论】:

  • 能否提供一些参数解析失败的查询字符串示例?

标签: spring-boot servlets tomcat9


【解决方案1】:

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

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

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

  • ?=noname,
  • ?urlEncoding=%ue

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多