背景:
1.默认情况下,SpringMVC只能响应前端发来的GET以及POST请求。
2.默认情况下,SpringMVC配合MultipartFile接受文件上传只能通过POST的方式发送。
解决问题:1:SpringMVC响应前端PUT、DELETE请求
配置web.xml:
<!--1、将post请求转换为put、delete请求 -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--2、put请求配置 使ajax可直接发送put,delete请求 -->
<filter>
<filter-name>httpPutFormContentFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpPutFormContentFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
说明:
- 若只配置filter1:hiddenHttpMethodFilter 则ajax请求写法为:
$.ajax({
url: "http://localhost:8080/test",
data: data+"&_method=PUT",//发送DELETE请求即将PUT修改为DELETE即可
type: "POST",
dataType: "json",
success: function (result) {
console.log(result);
}
})
- 同时配置filter1:hiddenHttpMethodFilter 和filter2:httpPutFormContentFilter 则ajax可写:
$.ajax({
url: "http://localhost:8080/test",
data: data,
type: "PUT",//发送DELETE请求即将PUT修改为DELETE即可
dataType: "json",
success: function (result) {
console.log(result);
}
})
解决问题2:SpringMVC响应前端PUT请求并接收文件数据
默认情况直接通过put请求向服务器发送文件数据,会在浏览器端收到500错误:
这样的问题直接去百度,得到的答案大部分都是提醒CommonsMultipartResolver的bean配置id应该是固定的写法:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10000000"/>
</bean>
确实,这里配置如果出错,浏览器端得到的错误和上面所得500一样。但这不是解决PUT请求问题的答案。配置了这个,只能说问题解决了一半。
要解决PUT请求发送文件数据的问题,我们要看看内脏
- 进入到CommonsMultipartResolver类可看到该类中有一个isMultipart()方法,顾名思义其作用为判断当前请求是否是一个文件请求:
一看好像没什么问题。继续进入到ServletFileUpload.isMultipartContent()中:
小朋友???过滤了POST请求,意思是除了POST请求,其它方式的请求都不配携带文件数据咯。
问题发现,现在就是解决问题了,既然原因是由于CommonsMultipartResolver类中的isMultipart()导致的,那我们直接重写该方法就是了。
- 继承CommonsMultipartResolver类并重写方法isMultipart()
package com.nys.override;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
/**
* 重写CommonsMultipartResolver中的isMultipart实现PUT请求上传文件
* @author nysheng
*/
public class MyCommonsMultipartResolver extends CommonsMultipartResolver {
private static final String POST_METHOD = "POST";
private static final String PUT_METHOD = "PUT";
@Override
public boolean isMultipart(HttpServletRequest request) {
return !(POST_METHOD.equalsIgnoreCase(request.getMethod())||PUT_METHOD.equalsIgnoreCase(request.getMethod()))
?false
:FileUploadBase.isMultipartContent(new ServletRequestContext(request));
}
}
- 修改bean配置:
<bean id="multipartResolver" class="com.nys.override.MyCommonsMultipartResolver">
<property name="maxUploadSize" value="10000000"/>
</bean>
测试结果:
@PutMapping("/test")
public ResultVO put(@RequestParam("logo") MultipartFile logo, HttpServletRequest request){
// 获取原文件名
System.out.println(logo);
return ResultVO.success();
}