【SpringMVC】HiddenHttpMethodFilter 过滤器配置实例及源码分析
2021/9/7 11:06:24
本文主要是介绍【SpringMVC】HiddenHttpMethodFilter 过滤器配置实例及源码分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 【前言】
- 【正文】
- 一、过滤器源码分析
- 二、代码实例
- (1)配置HiddenHttpMethodFilter过滤器
- (2)代码
- (3)请求链接
- 【结语】
【前言】
浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不
支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使
得支持 GET、POST、PUT 与 DELETE 请求。这个过滤器叫做HiddenHttpMethodFilter 。
【正文】
一、过滤器源码分析
public class HiddenHttpMethodFilter extends OncePerRequestFilter { private static final List<String> ALLOWED_METHODS; public static final String DEFAULT_METHOD_PARAM = "_method"; //因为这里固定了参数名称,所以我们在写请求隐含参数名称是必须写成“_method” private String methodParam = "_method"; public HiddenHttpMethodFilter() { } public void setMethodParam(String methodParam) { Assert.hasText(methodParam, "'methodParam' must not be empty"); this.methodParam = methodParam; } //处理过程:如果是POST请求就正常使用,如果不是POST请求,就将这个请求名称大写化,然后再使用对应的请求 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { HttpServletRequest requestToUse = request; if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) { String paramValue = request.getParameter(this.methodParam); if (StringUtils.hasLength(paramValue)) { String method = paramValue.toUpperCase(Locale.ENGLISH); if (ALLOWED_METHODS.contains(method)) { requestToUse = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method); } } } filterChain.doFilter((ServletRequest)requestToUse, response); } static { ALLOWED_METHODS = Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(), HttpMethod.DELETE.name(), HttpMethod.PATCH.name())); } private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper { private final String method; public HttpMethodRequestWrapper(HttpServletRequest request, String method) { super(request); this.method = method; } public String getMethod() { return this.method; } } }
二、代码实例
(1)配置HiddenHttpMethodFilter过滤器
<!--支持REST风格的过滤器:可以将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>
(2)代码
/** * 1.测试REST风格的 GET,POST,PUT,DELETE 操作 * 以CRUD为例: * 新增: /order POST * 修改: /order/1 PUT update?id=1 * 获取: /order/1 GET get?id=1 * 删除: /order/1 DELETE delete?id=1 * 2.如何发送PUT请求或DELETE请求? * ①.配置HiddenHttpMethodFilter * ②.需要发送POST请求 * ③.需要在发送POST请求时携带一个 name="_method"的隐含域,值为PUT或DELETE * 3.在SpringMVC的目标方法中如何得到id值呢? * 使用@PathVariable注解 */ @RequestMapping(value="/testRESTGet/{id}",method=RequestMethod.GET) public String testRESTGet(@PathVariable(value="id") Integer id){ System.out.println("testRESTGet id="+id); return "success"; } @RequestMapping(value="/testRESTPost",method=RequestMethod.POST) public String testRESTPost(){ System.out.println("testRESTPost"); return "success"; } @RequestMapping(value="/testRESTPut/{id}",method=RequestMethod.PUT) public String testRESTPut(@PathVariable("id") Integer id){ System.out.println("testRESTPut id="+id); return "success"; } @RequestMapping(value="/testRESTDelete/{id}",method=RequestMethod.DELETE) public String testRESTDelete(@PathVariable("id") Integer id){ System.out.println("testRESTDelete id="+id); return "success"; }
(3)请求链接
<!-- 实验1 测试 REST风格 GET 请求 --> <a href="springmvc/testRESTGet/1">testREST GET</a><br/><br/> <!-- 实验2 测试 REST风格 POST 请求 --> <form action="springmvc/testRESTPost" method="POST"> <input type="submit" value="testRESTPost"> </form> <!-- 实验3 测试 REST风格 PUT 请求 --> <form action="springmvc/testRESTPut/1" method="POST"> <input type="hidden" name="_method" value="PUT"> <input type="submit" value="testRESTPut"> </form> <!-- 实验4 测试 REST风格 DELETE 请求 --> <form action="springmvc/testRESTDelete/1" method="POST"> <input type="hidden" name="_method" value="DELETE"> <input type="submit" value="testRESTDelete"> </form>
【结语】
以上就是HiddenHttpMethodFilter 的内容啦~
感谢阅读~
欢迎提出宝贵建议!
这篇关于【SpringMVC】HiddenHttpMethodFilter 过滤器配置实例及源码分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-29RocketMQ底层原理资料详解:新手入门教程
- 2024-11-29RocketMQ源码资料解析与入门教程
- 2024-11-29[开源]6.1K star!这款电视直播源神器真的太赞啦!
- 2024-11-29HTTP压缩入门教程:轻松提升网页加载速度
- 2024-11-29JWT开发入门指南
- 2024-11-28知识管理革命:文档软件的新玩法了解一下!
- 2024-11-28低代码应用课程:新手入门全攻略
- 2024-11-28哪些办公软件适合团队协作,且能够清晰记录每个阶段的工作进展?
- 2024-11-28全栈低代码开发课程:零基础入门到初级实战
- 2024-11-28拖动排序课程:轻松掌握课程拖动排序功能