解决springmvc获取ajax发送DELETE或PUT请求时参数为NULL的情况
程序员文章站
2022-04-15 12:15:16
...
使用ajax发送type为put或者delete时,请求能到达后台,但后台springmvc无法获取参数,参数为null。
比如:
$.ajax({
type:'put',
url:url,
data:{version:version},
success:function(result){
if(result.statusCode==200){
window.location.href=xxx();
}else{
alert(result.statusCode+"-"+result.message);
}
},
error:function(result){
alert("请求无法送达,请重试!");
}
});
@PutMapping("/updateByVersion")
@ResponseBody
public ReturnData updateByVersion(@RequestParam("version")Integer version){
System.out.println("version-->"+version);
return configureService.updateConfigureByVersion(version);
}
此时version为null。
原因:
Tomcat处理参数的问题:
1.将请求体中的数据,封装成一个map
2.request.getParameter("id")就会从这个map中取值
3.SpringMvc封装POJO对象的时候, 会把POJO中每个属性的值进行request.getParamter();
4.AJAX发送PUT,DELETE请求引发的PUT,DELETE请求,请求体中的数据,request.getParamter()拿不到
Tomcat一看是PUT,DELETE就不会封装请求体中的数据为map,只有POST形式的请求才封装请求为map。
解决方式:将post请求转换为delete或put请求,这样后台就可以正常获取到传过来的请求参数。
1. 在web.xml配置文件中添加一个将post请求转换为delete或put请求的filter:
<!-- springMVC核心类,请求分发器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 解决ajax 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>
<!-- 备注,这边的名称必须和配置'springmvc'的servlet名称一样 -->
<servlet-name>SpringMVC</servlet-name>
</filter-mapping>
或者:效果等同上面的
<!-- 解决ajax 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.配置好后:前端ajax请求参数data需要加_method:"put或者delete"属性;
注意ajax请求必须是post:type:'post'
比如:put请求:
$.ajax({
type:'post',
url:url,
data:{ _method : "put", // 将请求转变为PUT请求
version:version},
success:function(result){
if(result.statusCode==200){
window.location.href=xxx;
}else{
alert(result.statusCode+"-"+result.message);
}
},
error:function(result){
alert("请求无法送达,请重试!");
}
});
delete请求:
$.ajax({
type:'post',
url:url,
data:{
_method:"delete",//转为delete请求
version:version
},
success:function(result){
if(result.statusCode==200){
$(obj).parent().parent().parent().parent().remove();
}else{
alert(result.statusCode+"-"+result.message);
}
},
error:function(result){
alert("请求无法送达,请重试!");
}
});
此时后台可以接受到ajax传的参数值:
put请求:
@PutMapping("/updateByVersion")
@ResponseBody
public ReturnData updateByVersion(@RequestParam("version")Integer version){
System.out.println("version-->"+version);
return configureService.updateByVersion(version);
}
delete请求:
@DeleteMapping("/deleteByVersion")
@ResponseBody
public ReturnData deleteByVersion(Integer version){
System.out.println("version------------>"+version);
return configureService.deleteConfigureByVersion(version);
}