form表单提交踩坑记

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

        今天收获了一次集团故障,心塞不已,究其原因,是form表单提交时web服务器对大小做了限制。这个必现的问题在测试阶段也不知为啥没测出来,项目太紧张,赶出来的东西果然质量没有保证。

        pc端和H5是两套逻辑。pc端直接提交的file,在webx中设置了单个文件不超过2M,总的不超过6M。刚提测不久,就提了bug,传大文件时服务端返回不正确。经过检查,发现在文件超过3M的时候服务端返回403。诡异的是,应用中并没有返回这个错误响应,打断点也总是不中。度娘后才发现,这是nginx报的错,咨询PE,把nginx的限制上调,这个问题算是解决了。

        无线端的问题在发布前并没有发现,nginx也放开了限制,此外无线端本身在上传前就已经做了压缩。上线后,一次日常测试中,突然发现iphone在上传多个文件时会报非法请求。最开始以为是前端处理中没有传校验参数,抓包后发现前端已经把参数传过来,但到后端应用入口却获取不到任何参数。由于安卓并没有出现这个问题,我坚持认为是前端的故障。无线端后台与PC端几乎一样的逻辑,没理由pc端ok,无线端掉链子。

        经过与测试、前端多次沟通,对比,发现iphone在压缩的时候相对安卓比例没那么大,在上传总的数据大小超过2M时会出现这种错误,而安卓压缩比较狠。奇怪,nginx已经放宽限制,返回的也不是403,为什么还会出现参数被抛弃的问题?pc端与无线端最大的不同就是,pc端是提交的file,无线端是对文件进行了base64编码成string传上来。难道是在request中处理form时有什么特殊处理?我把webx的资料又看了一遍,没有发现有配置的地方。我从第一个filter开始跟踪调试,还没有发现问题就开始抛空指针异常,原来是一个应该有的参数没有获取到。看来是在某个未知的地方参数就已经丢弃了。

         我只好自己写了一个简单的filter,放在首入口,代码很简单,直接取request.getParameterMap()。果然,代码一调用request.getParameterMap()就抛异常IllegalStateException,提示“form too large”。尼玛,竟然是应用服务器限制!度娘之,这篇说得很清楚http://benni82.iteye.com/blog/846887,jetty和tomcat服务器默认有表单大小限制(2M),jetty会抛异常,卑鄙的tomcat就无声无息的返回了。具体的解决方法文中也给了。

         好吧,在java web应用中,普通的表单字段可以通过request.getParameterMap()来获取,返回的是KV对;而file的读取可以参考org.apache.commons.fileupload.servlet.ServletFileUpload。

转载于:https://my.oschina.net/sayitok/blog/393832

你可能感兴趣的:(form表单提交踩坑记)