【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 过滤器配置实例及源码分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程