文档章节

关于在接收POST请求,Tomcat偶发性接收到的参数不全问题排查分析

陶邦仁
 陶邦仁
发布于 2016/05/31 09:30
字数 1041
阅读 466
收藏 4

#1 问题描述# 最近一直在搞每月一次的抽奖活动,并发量也比平时多了不少,随之而来的,就是平时遇不到的一些问题。这也是可喜可贺的啊,有问题才能成长,没有问题就是在浪费生命。

其中一个感觉比较奇葩的问题,就是:Tomcat在接收POST请求时,偶发性的POST参数接收不全,这个比例还很高。如下所示:

45应用服务器正常POST参数获取:

2016-05-19 15:45:15 INFO :request param : body=[{"appDevice":{"qdPlatform":"weixin","qdVersion":"1.4.1"},"activityId":80,"curPlanId":381,"memberId":"ff808081547ef0b401549f64e6cb2ecb","projectId":"31605061701144","prizeIds":[437,436,435,440,439,438],"planIds":[370,371,372,373,374,375,376,377,378,379,380,381,382]}]

45应用服务器不正常POST参数获取:

2016-05-19 16:03:16 INFO :request param : 7D,"activityId":80,"curPlanId":381,"memberId":"ff80808150f0fdd401510f83cae413a9","projectId":"708","prizeIds":[437,436,435,440,439,438][370,371,372,373,374,375,376,377,378,379,380,381,382][370,371,372,373,374,375,376,377,378,379,380,381,382]=[]

#2 排查问题# 排查问题之前,先理清服务架构,如图:

输入图片说明

排查问题开始之前,简单说下自己排查问题的几个原则(仅供参考):

  1. 问题重现:一定要先重现问题,任何重现不了的问题,都不是问题。同理,任何存在的问题,都必然能再次重现。

  2. 由近及远:先确认自己的代码无问题,然后再去确认外部代码无问题(如:框架代码,第三方代码等)。

  3. 由外到内:程序就是一个IPO,有输入Input(如:参数、环境等)也有输出Out(如:结果、异常等),输出Out是问题的表象,先确定外部因素Input无问题,再确认程序代码逻辑无问题。

  4. 由浅入深:其实就是由易到难、自上向下,先从上层应用排查问题,如:上层API、应用层、HTTP传输等,然后再确认底层应用排查问题,如:底层API、网络层、系统层、字节码、JVM等;

  1. 确认在上面日志输出的代码中是否存在并发问题,或逻辑Bug:
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keySet = parameterMap.keySet();
StringBuilder sb = new StringBuilder();

for(String key : keySet) {
    sb.append(key).append("=").append(Arrays.toString(parameterMap.get(key))).append(",");
}

log.info("request param : " + sb.toString()) ;

通过上面的两条日志输出,和以上代码的分析,可以得出以下结论:

  1. 以上代码不存在并发问题及逻辑Bug,POST参数是从原始request.getParameterMap()中获取,获取前后未做任何写入、转换处理;

  2. 通过不正常日志输出和以上代码逻辑来看,从request.getParameterMap()中获取的参数,"body"这个Key已经丢失,且对于的Value也存在部分丢失,ParameterMap中的Key-Val混乱;

  1. 确认是否存在tomcat POST/GET参数长度限制,nginx POST/GET参数长度限制,导致请求参数截断:

很快就排除了这种可能,因为参数不全是偶发性产生的,如果是由于参数长度限制导致请求参数截断,而应该是100%产生参数不全的问题。

  1. 根据上面服务架构图和由外到内的原则,通过tcpdump和Wireshark来分析,进入前端Nginx服务器的请求参数是否存在不全:

输入图片说明

可以确认,用户的请求从浏览器发出在到达Nginx之前,POST请求参数就已经丢失;

注意:想要了解更多tcpdump和Wireshark分析使用,请参考聊聊tcpdump与Wireshark抓包分析

#3 解决问题# 在上面排查问题的过程中,就已经确定了是用户前端传过来的参数问题,但从前端代码排查来看,其实也没有发现问题,只是在前端做了个JSON序列化。所以为了避免问题再次发生,将前端序列化去掉,保持HTTP请求参数原始传输,由前端的代理服务再进行序列化后,提交给后端应用。 #4 总结问题# 其实对于问题的解决并不重要,有时或许只是一个空格、一个微小的配置等,重要的是在于问题的分析过程、分析思路,怎么样有个清晰的思路,快速的定位问题,才是解决问题的关键。

© 著作权归作者所有

陶邦仁
粉丝 1690
博文 420
码字总数 1483887
作品 0
海淀
技术主管
私信 提问
加载中

评论(1)

l
lmsother
非常不错的分析
关于tomcat Post 数据参数的问题

POST请求本身并未限制传入参数大小,是tomcat 容器设置了接收参数大小的限制。修改server.xml 其中参数maxPostSize="10240"是限制post请求参数的大小,将值改为0代表不限制。 开始,参数 的含...

凌云之狮
2018/06/01
47
0
java web中的中文乱码问题——浏览器与服务器之间的中文乱码

一. 乱码产生原因 浏览器在向服务器发送请求时会对携带的请求参数进行编码(UTF-8格式),服务器在接收到请求参数时会对其进行解码,由于浏览器与服务器编码格式不同产生乱码。不同服务器默认...

littleant2
2015/08/30
234
0
springMVC 获取不到ajax post请求传递过来的参数

前端代码: 火狐中查看post请求的参数如上图 后台代码: 后台 就是这样一个简单的方法,接收不到post传递过来的参数,进断点时显示几个参数均为null 并且这个问题在本机使用jetty测试时不会出...

祥林没有嫂
2015/04/22
25.1K
8
spring mvc处理ios 请求头不全时空参 无法解析的问题处理

ios前端比较懒~囧 ,还有已安装的app用户 ,不愿意更新等问题 导致 请求头无法补全给服务端springmvc发送过来。。。。。悲剧了 只能服务端自己处理这个不全的http请求空参无法解析的问题 尝试...

angle_小帅
2015/03/09
829
0
学习SpringMVC——如何获取请求参数

  @RequestParam,你一定见过;@PathVariable,你肯定也知道;@QueryParam,你怎么会不晓得?!还有你熟悉的他(@CookieValue)!她(@ModelAndView)!它(@ModelAttribute)!没错,仅注解...

Java团长
2018/01/13
66
0

没有更多内容

加载失败,请刷新页面

加载更多

SDKMAN推荐一个好

是在大多数基于Unix的系统上管理多个软件开发工具包的并行版本的工具。它提供了一个方便的命令行界面(CLI)和API来安装,切换,删除和列出sdk相关信息。以下是一些特性: By Developers, fo...

hotsmile
24分钟前
4
0
什么是 HDFS

是什么? HDFS 是基于 Java 的分布式文件系统,允许您在 Hadoop 集群中的多个节点上存储大量数据。 起源: 单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在集群上的文件系统称...

Garphy
27分钟前
2
0
一起来学Java8(四)——复合Lambda

在一起来学Java8(二)——Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda。 Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用Lambda表达式实现函...

猿敲月下码
53分钟前
10
0
debian10使用putty配置交换机console口

前言:Linux的推广普及,需要配合解决实际应用方能有成效! 最近强迫自己用linux进行实际工作,过程很痛苦,还好通过网络一一解决,感谢各位无私网友博客的帮助! 系统:debian10 桌面:xfc...

W_Lu
今天
10
0
aelf Enterprise 0.8.0 beta有奖公测,“Bug奖金计划”重磅开启

2019年9月30日,aelf Enterprise 0.8.0 beta版正式发布。aelf Enterprise 0.8.0 beta是一个完备的区块链系统, 包含完备的区块链系统、开发套件、开发文档、以及配套的基础应用和基础服务。 ...

AELF开发者社区
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部