让SpringMVC支持REST风格的PUT、DELETE请求的方法

JAVA herman 6077浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

近年来REST风格大行其道!目前在使用REST风格的网站有:github,gitbook,facebook等,国外的目前BAT也在使用。但是最近部分网友反馈,SpringMVC支持REST时,遇到请求参数取值为null的情况。今天我就为大家分享一下如何解决这样的问题?

HTTP的8中请求方式

一些新手,可能只知道http有get和post请求。但我告诉你http一共有8中请求方式,get和post只是最常用的两种吧了。看下面8中请求的方法和作用:

  • GET:请求获取由 Request-URI 所标识的资源
  • POST:请求服务器接收在请求中封装的实体,并将其作为由 Request-Line 中的 Request-URI 所标识的资源的一部分
  • HEAD:请求获取由 Request-URI 所标识的资源的响应消息报头
  • PUT:请求服务器存储一个资源,并用 Request-URI 作为其标识符
  • DELETE:请求服务器删除由 Request-URI 所标识的资源
  • TRACE:请求服务器回送到的请求信息,主要用于测试或诊断
  • CONNECT:保留将来使用
  • OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求

在REST中我们基本上只会用到get、post、put、delete四中请求方式。

SpringMVC处理put、delete请求

在项目实际的开发过程中,我们使用ajax请求put和delete操作。发现controller接收的自定义实体类形参的各个属性都是null。ajax请求如下:

$.ajax({
	url:‘www.xttblog.com’,
	type:‘put’,
	data:{}
});

很多网友得出结论是浏览器不支持,这是一种错误的理解。其实是我们的服务器不支持,一般的Tomcat,JBoss等服务器禁止了put和delete等请求。我们可以使用SpringMVC自带的过滤器HiddenHttpMethodFilter来支持put和delete请求。首先需要在web.xml中配置HiddenHttpMethodFilter,配置如下:

<filter> 
	<filter-name>hiddenHttpMethodFilter</filter-name> 
	<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
	<init-param> 
		<param-name>methodParam</param-name> 
		<param-value>requestMethod</param-value> 
	</init-param> 
</filter> 
<filter-mapping> 
	<filter-name>hiddenHttpMethodFilter</filter-name> 
	<url-pattern>/*</url-pattern> 
</filter-mapping>

另外在ajax请求时,在data参数中,还需要做如下配置:

$.ajax({
	url:‘www.xttblog.com’,
	type:‘post’,
	data:{
		 _method:put,
	}
});

Tomcat支持put和delete请求

让Tomcat支持put和delete的做法很简单,我们只需要在tomcat的web.xml文件中配置org.apache.catalina.servlets.DefaultServlet的readonly属性为false即可。具体配置如下:

<servlet>
	<servlet-name>default</servlet-name>
	<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
	<init-param>
		<param-name>debug</param-name>
		<param-value>0</param-value>
	</init-param>
	<init-param>
		<param-name>readonly</param-name>
		<param-value>true</param-value>
	</init-param>
	<init-param>
		<param-name>listings</param-name>
		<param-value>false</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

这里需要注意的是,web.xml是Tomcat下的web.xml,不是项目中WEB-INF下的web.xml文件。

版权声明:本文为博主原创文章,未经博主允许不得转载。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 让SpringMVC支持REST风格的PUT、DELETE请求的方法