springboot2 - 请求相关的兼容配置

StandardServletMultipartResolver

StandardServletMultipartResolver 在 spring4 和 spring5 代码是不一样的。

在低版本 spring 环境下,文件只能通过 POST 请求提交。

对程序的影响可能不大,因为现在的做法,基本形成统一的定式:

文件表单和业务表单分离,先将文件上传,返回一段 url,再将 url 加入到业务表单之后提交,

如果采用这种设计,整个应用只需要一个上传接口就够了。

package org.springframework.web.multipart.support;

public class StandardServletMultipartResolver implements MultipartResolver {

    public boolean isMultipart(HttpServletRequest request) {
        if (!"post".equalsIgnoreCase(request.getMethod())) {
            return false;
        } else {
            String contentType = request.getContentType();
            return StringUtils.startsWithIgnoreCase(contentType, "multipart/");
        }
    }
}
package org.springframework.web.multipart.support;

public class StandardServletMultipartResolver implements MultipartResolver {

    @Override
    public boolean isMultipart(HttpServletRequest request) {
        return StringUtils.startsWithIgnoreCase(request.getContentType(), "multipart/");
    }
}

HiddenHttpMethodFilter

引入 Restful 概念之后,多出了一些请求方式:PUT、DELETE。

Restful 毕竟是新的概念,不是任何场景,都能成功提交 PUT、DELETE 请求。

如果出现不兼容,就可以启用 HiddenHttpMethodFilter。

提交表单的时候,在表单中增加一个参数,name 是 _method,value 就是你所需要的请求方式,
表单仍然以 POST 方式提交,到后台之后,程序会自动将请求方式转换成你指定的方式。

启用方式如下:

spring:
  # 启用 HiddenHttpMethodFilter,允许以 POST 的方式提交 PUT、DELETE 等类型请求
  mvc:
    hiddenmethod:
      filter:
        enabled: true

比如:通过表单提交一个 DELETE 请求:

<!-- 表单实际是以 POST 请求方式提交 -->
<form target="_blank" method="post">
  <input type="number" name="id" value="1">
  <!-- 增加一个字段,声明本次请求方式 -->
  <input type="hidden" name="_method" value="DELETE">
</form>

也可以对 ajax 进行二次封装:

// jQuery环境下纪念款程序代码
function ajax(options) {
    if (options.type === "PUT") {
        options.data._method = "PUT";
    } else if (options.type === "DELETE") {
        options.data._method = "DELETE";
        options.type = "POST";
    } else if (options.type === "POST") {
        options.data._method = "POST";
    } else if (options.type === "GET") {
        options.data._method = "GET";
    }
    let layer_load_index = layer.load();

    return new Promise((resolve, reject) => {
        jQuery.ajax(
            options
        ).always(function () {
            layer.close(layer_load_index);
        }).fail(function (xhr, status, err) {
            console.error(xhr.responseText);
            console.error(xhr.status);
            console.error(xhr.readyState);
            console.error(xhr.statusText);
            console.error(status);
            reject(err);
        }).done(function (result) {
            resolve(result);
        });
    });
}

posted on 2024-05-17 17:22  疯狂的妞妞  阅读(7)  评论(0编辑  收藏  举报

导航