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

解决springmvc获取ajax发送DELETE或PUT请求时参数为NULL的情况

程序员文章站 2022-04-15 12:15:34
...

附:SpringMVC的REST风格的四种请求方式

我们都知道想要使用PUT请求和DELETE请求就要使用RESR风格,
在web.xml文件中配置HiddenHttpMethodFilter过滤器如下:

<!-- HiddenHttpMethodFilter过滤器可以将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>

但是配置过滤器之后,仍旧不能和post一样正常使用put,
如果直接发送ajax=PUT形式的请求,前台有参数,但是controller接收请求的对象的属性参数都为null,也就是后台根本接受不到任何参数

问题:

请求体中有数据,但是后台接收不到任何数据

原因:

产生这个问题的原因和Tomcat有关
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请求带上“_method”参数:

date带上“_method=PUT”参数或者DELETE参数

			$.ajax({
				url:"${APP_PATH}/emp/"+$(this).attr("edit-id"),
				type:"POST",
				data:$("#empUpdateModal form").serialize()+"&_method=PUT",
				success:function(result){
					alert("success");
				}
			});
	@RequestMapping(value="/emp/{empId}",method=RequestMethod.POST)
	@ResponseBody
	public Msg updateEmp(Employee employee){
		employeeService.updateEmp(employee);
		return Msg.success();
	}

解决方式二:重点!!敲黑板!

虽然方法一可以使用,但是还有更方便的方法,可以直接使用PUT或DELETE请求:

将post请求转换为delete或put请求,这样后台就可以正常获取到传过来的请求参数。
在web.xml配置文件中添加一个将post请求转换为delete或put请求的filter:

  <!--请求过滤器 ,使用Rest风格的URL,将页面普通的post请求转为指定的delete或put请求-->
  <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>
  <!-- 解决PUT请求参数为NULL问题:可直接发PUT请求,避免后端接收不到数据 -->
  <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>
	@RequestMapping(value="/emp/{empId}",method=RequestMethod.PUT)
	@ResponseBody
	public Msg updateEmp(Employee employee){
		employeeService.updateEmp(employee);
		return Msg.success();
	}

上一篇: go get问题记录

下一篇: get请求