Tomcat 无法解析POST请求的参数


这几天碰到一个问题。服务发布后,无法接收post请求。准确的说,所有post请求的参数都为空。为什么会出现这种情况呢?

首先,得明确所有的post请求都是存放在http body里面的。之所以通常我们可以通过getParamenter(name)去获取参数,是因为容器(tomcat, jetty等)对http body的内容进行了处理,把参数读取到了paramenterMap里面。

接下来去解决问题。

网上说有一种情况,说我的请求是multiplepart的方式。显然不是这个原因,我已经加了这样的拦截,如果是multiple-part,直接转成MultipartRequest。况且,通过请求头的打印,可以验证这一点。

public class MultiplePartInterceptor implements Interceptor {

    public MultiplePartInterceptor() {
        super();
    }


    @Override
    public void intercept(Invocation inv) {
        String content_type = inv.getController().getRequest().getContentType();
        System.out.println(content_type);
        if (content_type != null && content_type.toLowerCase().indexOf("multipart") != -1) {
            if (inv.getController().getRequest() instanceof MultipartRequest == false)
                inv.getController().setHttpServletRequest( new MultipartRequest(inv.getController().getRequest()));
        }
        
        inv.invoke();
    }

}

还有一种说法,就是我在getParamenter之前就调用了getInputStream或者getReader。因为这两个方法只能读取一次,第二次读取的时候就为null。getParamenter其实第一次也是从http body里面读取一次。所以,如果getParamenter如果发生在getInputStream之后,那么getParamenter是没有值的。但是也明显不是这个原因。因为,程序之前是好的,后面偶然发生的这个问题。为了验证这个,我还在getParamenter之后打印了http body里面的内容。没有问题。如果真的需要多次调用getInputStream,可以通过重写HttpServletRequestWrapper来实现这个。推荐一篇博客

System.out.println(getRequestBody(request.getInputStream()));

 //获取http body
 private String getRequestBody(InputStream stream) {
        String line = "";
        StringBuilder body = new StringBuilder();
        int counter = 0;

        // 读取POST提交的数据内容
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        try {
            while ((line = reader.readLine()) != null) {
                if (counter > 0) {
                    body.append("\r\n");
                }
                body.append(line);
                counter++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return body.toString();
    }

那么现在问题来了,具体是什么原因呢。之前用的tomcat8的容器,现在把tomcat8删掉,换一个tomcat7。一切正常,post请求能正常接收。那肯定是tomcat的配置错了。经过仔细比对,终于发现了问题的所在。之前为了上传文件,设置了取消post请求限制maxPostSize=0。但是,tomcat8以后,maxPostSize必须小于0才能关闭post请求大小的限制。所以把maxPostSize的值改为-1就正常了。


有时候,在解决一个问题的过程中,往往会让你对某个技术点有更深入的了解。所以,不要怕遇到问题,重要的是遇到问题后能形成解决问题的思路。

你可能感兴趣的:(Tomcat 无法解析POST请求的参数)