由多线程导致的request请求参数获取不到问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

症状

代码还是按照常规写法写的,莫名其妙的忽然使用request拿不到参数。

由多线程导致的request请求参数获取不到问题_第1张图片

如上面的代码,springmvc帮我们自动做的映射数据拿不到数据,使用request.getParameter("dpId") 也拿不到数据。 @RequestParam  等等方式都试过就是拿不到。

再说页面,这个bug还神奇的在这里,先说业务,我们这个系统会先进入一个页面,这个页面是一个数据下发状态的显示,这时候用户会有一个操作,点击页面的下发数据操作,这时候后台会启动一个线程执行下发数据操作(这个操作是很耗时的),线程启动后返回,前端判断已经启动成功,就会再次刷新这个页面。这个时候,就会出现上面这个错误,拿不到前端参数,如果切换到其他的页面,还是可以正常获取参数。

定位过程:最开始是怀疑请求的方式有问题,换了get  post ,参数都有就是拿不到,然后怀疑是请求的类型有问题,

由多线程导致的request请求参数获取不到问题_第2张图片

这些换了还是存在这个问题,然后配置打开tomcat的容器日志,

dc01f08bf08dc073050b8156ca06773aa21.jpg

可以看到参数是被tomcat拿到了的,基本可以排除是前端的问题了,那后端就可能是拦截器这里搞的鬼,再次检查全部的拦截器,这时候发现

request.getQueryString();

可以拿到参数,request.getParmeter 还是拿不到参数,然后各种bug排查,最终还是没定位到。最后,异想天开的将

由多线程导致的request请求参数获取不到问题_第3张图片

如上代码,启动线程这一块注释掉,可以获取到参数了,问题终于定位到是多线程这里的问题。

那到底是哪里的问题呢?

线程中的各种异常都处理了,唯一有点不一样的是,request是传入的,这个类我并不太了解,会不会是这里的问题,将request中的数据拿出来后,单独传入必要的参数后,问题解决了,基本可以确定是request传入到多线程中导致的问题了,而且也可以解释因为为什么第二次请求会有问题,切换页面请求又没有问题了,很大可能就是request是同一个request导致的。

转载于:https://my.oschina.net/sprouting/blog/3045489

你可能感兴趣的:(由多线程导致的request请求参数获取不到问题)