Spring MVC过滤器-HiddenHttpMethodFilter

Posted codingcc1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC过滤器-HiddenHttpMethodFilter相关的知识,希望对你有一定的参考价值。

Spring MVC过滤器-HiddenHttpMethodFilter

浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求,该过滤器为HiddenHttpMethodFilter。

HiddenHttpMethodFilter的父类是OncePerRequestFilter,它继承了父类的doFilterInternal方法,工作原理是将jsp页面的form表单的method属性值在doFilterInternal方法中转化为标准的Http方法,即GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE,然后到Controller中找到对应的方法。例如,在使用注解时我们可能会在Controller中用于@RequestMapping(value = "list", method = RequestMethod.PUT),所以如果你的表单中使用的是

,那么这个表单会被提交到标了Method="PUT"的方法中。

需要注意的是,由于doFilterInternal方法只对method为post的表单进行过滤,所以在页面中必须如下设置:

<form action="..." method="post">
    <input type="hidden" name="_method" value="put" />
        ......
</form>

而不是使用:

<form action="..." method="put">
        ......
</form>

同时,HiddenHttpMethodFilter必须作用于dispatcher前,所以在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>  
                <servlet-name>spring</servlet-name>  
        </filter-mapping>
        <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:dispatcher.xml</param-value>
        </init-param>
    </servlet>
        <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

下面是一个示例:

<form th:action="@/emp" method="post">  
<!--发送put请求修改员工数据-->
    <!--
1、SpringMVC中配置HiddenHttpMethodFilter;(SpringBoot自动配置好的)
2、页面创建一个post表单
3、创建一个input项,name="_method";值就是我们指定的请求方式
-->
    <input type="hidden" name="_method" value="put" th:if="$emp!=null"/>
    <input type="hidden" name="id" th:if="$emp!=null" th:value="$emp.id">
    <div class="form-group">
        <label>LastName</label>
        <input name="lastName" type="text" class="form-control" placeholder="zhangsan" th:value="$emp!=null?$emp.lastName">
    </div>
    <div class="form-group">
        <label>Email</label>
        <input name="email" type="email" class="form-control" placeholder="[email protected]" th:value="$emp!=null?$emp.email">
    </div>
    <div class="form-group">
        <label>Gender</label><br/>
        <div class="form-check form-check-inline">
            <input class="form-check-input" type="radio" name="gender" value="1" th:checked="$emp!=null?$emp.gender==1">
            <label class="form-check-label">男</label>
        </div>
        <div class="form-check form-check-inline">
            <input class="form-check-input" type="radio" name="gender" value="0" th:checked="$emp!=null?$emp.gender==0">
            <label class="form-check-label">女</label>
        </div>
    </div>
    <div class="form-group">
        <label>department</label>
        <!--提交的是部门的id-->
        <select class="form-control" name="department.id">
            <option th:selected="$emp!=null?$dept.id == emp.department.id" th:value="$dept.id" th:each="dept:$depts" th:text="$dept.departmentName">1</option>
        </select>
    </div>
    <div class="form-group">
        <label>Birth</label>
        <input name="birth" type="text" class="form-control" placeholder="zhangsan" th:value="$emp!=null?$#dates.format(emp.birth, 'yyyy-MM-dd HH:mm')">
    </div>
    <button type="submit" class="btn btn-primary" th:text="$emp!=null?'修改':'添加'">添加</button>
</form>

以上是关于Spring MVC过滤器-HiddenHttpMethodFilter的主要内容,如果未能解决你的问题,请参考以下文章

使用 spring-data-jpa 和 spring-mvc 过滤数据库行

我们可以在 Spring WebFlux 应用程序中重用 Spring MVC 过滤器吗

Spring MVC字符编码过滤器

Spring MVC字符编码过滤器

spring mvc中如何过滤form提交数据中的空格?

spring mvc 怎么加filter