【SpringMVC】HiddenHttpMethodFilter 过滤器配置实例及源码分析

【SpringMVC系列】入门案例

【SpringMVC系列】基础知识

【SpringMVC系列】@RequestMapping注解 详解

【SpringMVC系列】HiddenHttpMethodFilter 过滤器配置实例及源码分析

【SpringMVC系列】请求数据和响应数据的处理

【SpringMVC系列】RestFul编程风格

【SpringMVC系列】视图解析器详解

【SpringMVC系列】springmvc处理JSON

【SpringMVC系列】文件上传及下载实例详解

【SpringMVC系列】拦截器及实例讲解

【SpringMVC系列】工作流程详解

【SpringMVC系列】监听器配置



【前言】

浏览器 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 的内容啦~


感谢阅读~
欢迎提出宝贵建议!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我真爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值