springboot 2.0.4及以前版本 http put上传 FormData无法接收数据的解决方法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_25117137/article/details/83417409
formData = new FormData();
formData.append('field1', "value1");
formData.append('field2', "value2");

$.ajax({
    type: "put",
    url:"urldsf",
    data:formData,
    processData:false,
    contentType:false,
    success: result=> {
 
    },
    error:function () {

    }
}

上述代码在后代接收不到参数,代码调试俩个小时候发现了问题(在家是最新的一点问题都没,公司不是最新的,汗!!)。。。

在org.apache.catalina.connector.Request类中

parseParameters方法

protected void parseParameters() {//代码未贴全,只贴了关键部分
        parametersParsed = true;

        Parameters parameters = coyoteRequest.getParameters();
        boolean success = false;
        try {
            // Set this every time in case limit has been changed via JMX
            parameters.setLimit(getConnector().getMaxParameterCount());

            // getCharacterEncoding() may have been overridden to search for
            // hidden form field containing request encoding
            Charset charset = getCharset();

            boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
            parameters.setCharset(charset);
            if (useBodyEncodingForURI) {
                parameters.setQueryStringCharset(charset);
            }
            // Note: If !useBodyEncodingForURI, the query string encoding is
            //       that set towards the start of CoyoyeAdapter.service()

            parameters.handleQueryParameters();

            if (usingInputStream || usingReader) {
                success = true;
                return;
            }

            if( !getConnector().isParseBodyMethod(getMethod()) ) {
                //这句代码导致http put不会进行multipart/form-data解析(具体为什么,可自行 
                //调试,很简单的)。在最新的springboot 2.0.5及以后将这句代码挪到了
                //if("multipart/form- data".equals(contentType)) 这个之后,就能正常的    
                //接收数据了。
                success = true;
                return;
            }

            String contentType = getContentType();
            if (contentType == null) {
                contentType = "";
            }
            int semicolon = contentType.indexOf(';');
            if (semicolon >= 0) {
                contentType = contentType.substring(0, semicolon).trim();
            } else {
                contentType = contentType.trim();
            }

            if ("multipart/form-data".equals(contentType)) {
                parseParts(false);
                success = true;
                return;
            }
    }
}

最简单的方法是讲springboot升级到2.0.5及以上版本。

若2.0.4及以前版本若想解决此问题,我个人的想法是修改org.apache.catalina.connector.Connector的parseBodyMethods变量或者修改springboot的内嵌tomcat版本(tomcat版本修改8.5.34及以后的版本),或者使用外部tomcat,具体什么版本,请自行查找
 

还有一种方法;参考了https://blog.csdn.net/asd1098626303/article/details/60868316?utm_source=blogxgwz7

前台改为

$.ajax({
    type: "put",
    url:"urldsf",
    data:{
        'field1':"value1",
        'field2':"value2"
    },
    contentType:"application/x-www-form-urlencoded",
    success: result=> {
 
    },
    error:function () {

    }
}

也就是不使用formData这种格式,但是无法解决上传文件这种问题(当然可以通过文件转base64码解决(猜想的,未实践))

展开阅读全文

没有更多推荐了,返回首页