由于浏览器只支持发送get和post方式的请求,那么该如何发送put和delete请求呢?
SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求
HiddenHttpMethodFilter 处理put和delete请求的条件:
- 当前请求的请求方式必须为post
- 当前请求必须传输请求参数_method
满足以上条件,HiddenHttpMethodFilter 过滤器就会将当前请求的请求方式转换为请求参数_method的值,因此请求参数_method的值才是最终的请求方式
在web.xml中注册HiddenHttpMethodFilter
<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>
注:SpringMVC需要在过滤器:HiddenHttpMethodFilter前提供字符编码过滤器CharacterEncodingFilter 。在web.xml中注册时,必须先注册CharacterEncodingFilter,再注册HiddenHttpMethodFilter。(web.xml中过滤器的先后顺序就是过滤器的执行顺序)
原因:
- 在 CharacterEncodingFilter 中通过 request.setCharacterEncoding(encoding) 方法设置字符集的
- request.setCharacterEncoding(encoding) 方法要求前面不能有任何获取请求参数的操作
- 而 HiddenHttpMethodFilter 恰恰有一个获取请求方式的操作:
String paramValue = request.getParameter(this.methodParam);
查看怎么设置CharacterEncodingFilter点击这里
设置好HiddenHttpMethodFilter过滤器,我们测试一下,先写一个只能接受delete
请求的Controller
@Controller
public class HelloController {
@RequestMapping(value = "/hello",method = RequestMethod.DELETE)
public String hello(String username){
System.out.println("接受到delete请求username: "+username);
return "index";
}
@RequestMapping("/")
public String index(){
return "index";
}
}
index.html文件
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form th:action="@{/hello}" method="post">
<input type="hidden" name="_method" value="delete">
<input type="text" name="username" >
<input type="submit" value="提交">
</form>
</body>
</html>
先用请求项目根路径
/
得到index.html .再借助from表单,发送一个带有键值对_method=delete
的post
请求,发送到后端可经过HiddenHttpMethodFilter时,会将post报文转变为delete请求方式的报文
查看后端结果: