欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决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);
	}

 

我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。