https://www.cnblogs.com/roobtyan/p/9576685.html

原因:

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。

解决方案

这个问题有两种解决方案,第一种比较复杂,第二种比较简单,正常我们肯定是使用第二种的,当然并不排除使用第一种方式的场景.

方案一

  • 配置web.xml文件
  • 将POST请求转发为put/delete请求
<!--使用Rest风格的URI-->
<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>

  

在发送Ajax请求的时候,使用如下的格式:

$.ajax({
url: "${pageContext.request.contextPath}/emp/" + id,
type: "POST",
data: $("#app form").serialize() +"&_method=PUT",
success: function (result) {
alert("操作成功!");
}
});

  

可以看到不同的地方,首先配置HiddenHttpMethodFilter,这个类可以把POST转换成对应的_method=?的?号中的内容,从而实现请求.当然每次写Ajax请求的时候,都需要协商method字段,便于解析.

方案二

方案二就比较简单了.只需要一个简单的web.xml的配置.

<!--配置SpringMVC,把PUT或者DELETE请求转换成POST-->
<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>

  

或者

<!-- 解决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>

  

然后就可以很自然的使用Ajax请求而不需要做任何的处理.

$.ajax({
url: "${pageContext.request.contextPath}/emp/" + id,
type: "PUT",
data: $("#app form").serialize(),
success: function (result) {
alert("操作成功!");
}
});

  

最新文章

  1. mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案
  2. Newtonsoft.Json 用法
  3. 读javascript高级程序设计13-JSON
  4. [原]Water Water Search Problems&amp;#39; Set~Orz【updating...】
  5. vi之跳到指定行
  6. HDU 3410 &amp;amp;&amp;amp; POJ 3776 Passing the Message 单调队列
  7. 深入理解ob_flush和flush的区别(转)
  8. H面试程序(29):求最大递增数
  9. windows socket----select模型
  10. openstack私有云布署实践【11.3 计算nova - compute节点-nova用户免密登录(用于云主机冷迁移+扩展云主机大小)】
  11. 论文阅读笔记五十四:Gradient Harmonized Single-stage Detector(CVPR2019)
  12. HDU 6321 Dynamic Graph Matching
  13. tensorflow 学习纪录(持续更新)
  14. Android中一张图片占据的内存大小是如何计算
  15. 关于STM32 __IO 的变量定义
  16. Radar Installation---(贪心)
  17. SpringMVC Shiro与filterChainDefinitions
  18. java线程五种状态
  19. truffle的调用nodeJs的问题
  20. SSH整合主要XML代码

热门文章

  1. 【转帖】微软全新Windows 10X细节一览
  2. Python Web开发技术栈
  3. Windows中的消息与消息队列
  4. ViewState到底是什么
  5. .NET子页Main页面实例(UI页面)
  6. 8 search中的timeout参数
  7. python调用jenkinsAPI构建jenkins,并传递参数
  8. 定时任务 Quarzt
  9. weui中的picker使用js进行动态绑定数据
  10. aiohttp你不知道的异步操作网络请求