首页 > 其他分享 >Springcloud学习笔记56--SpringBoot之GET请求与Post请求参数偶发性丢失问题

Springcloud学习笔记56--SpringBoot之GET请求与Post请求参数偶发性丢失问题

时间:2023-03-10 15:44:38浏览次数:48  
标签:请求 GET Request 参数 recycle 解析 parameter SpringBoot

1. 概述

最近遇到一个偶现的问题,在向服务端请求的时候,偶尔会出现异常,在请求中的query String 传递了参数,却出现了异常MissingServletRequestParameterException
如下所示:

org.springframework.web.bind.MissingServletRequestParameterException: Required long parameter 'xxx' is not present

300个并发请求,就有5到6个请求丢失参数。

但是,既然错误日志出现了,就不能轻易地放过,尤其是这种偶现的错误,充满着风险,极有可能在某个关键时刻爆发。因此决定抽出时间排查这个问题。接下来,就是整个排查过程。

首先想到的是查看Request的类图结构。以及请求被处理的流程图

 

 

 

图片来自Tomcat源码分析(四)—— Request和Response处理的全过程

所以,最原始的数据被保存在了org.apache.coyote.Request这个类中,深入这个类,我们就能够更接近答案。于是直接到了Http11Processor的service方法中,看具体的处理过程。首先在799行加断点,看看是处理结果是什么,由于问题是处在parameter上,直接查看此时request中parameters的各种值。

正常请求:

 

 

异常请求:

 

 

对比两者不难发现,异常请求中的queryMB与正常请求中的是一样的,也就是说我们请求中带的参数被传递到了服务器。但异常请求didQueryParameters被置成了true,而从代码中可以知道,这个代码实际上是用于判断query string是否已经被解析过了,并且,在请求处理结束的时候,会调用parameter的recycle方法

    public void recycle() {
        parameterCount = 0;
        paramHashValues.clear(); //清空了解析后的parameter map
        didQueryParameters=false; //是否被解析过,置成false
        encoding=null;
        decodedQuery.recycle();
        parseFailedReason = null;
    }

 

标签:请求,GET,Request,参数,recycle,解析,parameter,SpringBoot
From: https://www.cnblogs.com/luckyplj/p/17203561.html

相关文章