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

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码解决(猜想的,未实践))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值