Ajax发送PUT请求引发的“血案”

1、问题:

根据restful风格URI的规则,在执行修改操作时,使用PUT请求,但是,如果使用Ajax直接发送PUT请求,会拿不到请求体中的数据。

2、原因:
tomcat:

1)将请求体中的数据封装成一个map对象;
2)request.getParameter("empName")就会从这个map中取值;  3)
SpringMVC封装POJO对象的时候,会把POJO中每个属性的值,request.getParameter("empName");

3、 AJAX发送PUT请求引发的血案:

PUT请求:请求体中的数据,采用request.getParameter(“empName”)的方式拿不到。tomcat一看是PUT请求不会封装请求体中的数据为map,只有POST形式的请求才封装请求体为map。

tomcat源码

org.apache.catalina.connector.Request--parseParameters() (3111多行)
     
       protected String parseBodyMethods = "POST";

       if ( !getConnector().isParseBodyMethod(getMethod())){
              success = true;
               return;
        }
        ……

源码解读:使用getConnector()方法获得一个连接对象。只有POST请求才会执行后续的方法,如果不是POST请求,则会进入if语句当中,return结束!

4、解决方案
方案1:

web.xml:

  <!--使用rest风格请求:将普通的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>

index.jsp: 在data后面添加&_method=PUT

$.ajax( {
           url:"${PATH}/employee/"+$(this).attr("edit-id"),
           type:"POST",
           data:$("#emp_update_model form").serialize()+"&_method=PUT",
           success:function (result) {
               alert(result.msg);
           }
       });

方案2:
在web.xml中配置HttpPutFormContentFilter。

<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>

作用:1) 将请求体中的数据解析包装成一个map;
   2) 重新包装request请求:request.getParameter()被重写,就会从自己封装的map中取数据。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值