HiddenHttpMethodFilter

Spring 3.0引入的HiddenHttpMethodFilter使得在浏览器表单中支持PUT和DELETE等HTTP方法。该过滤器通过转化POST请求中的隐藏字段_method来实现。当表单以POST方式提交并包含_method参数时,HiddenHttpMethodFilter会将请求包装成指定的HTTP方法,如PUT或DELETE,从而匹配Controller中的相应处理方法。配置时,需要确保该过滤器在DispatcherServlet之前生效,并可在web.xml中定制methodParam参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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),所以如果你的表单中使用的是

<form method="put">,那么这个表单会被提交到标了 Method=“PUT” 的方法中。

public class HiddenHttpMethodFilter extends OncePerRequestFilter {
    private static final List<String> ALLOWED_METHODS;
    public static final String DEFAULT_METHOD_PARAM = "_method";
    private String methodParam = "_method";
    ......
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);
}

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

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

同时,HiddenHttpMethodFilter 必须作用于 dispatcher 前。

同样的,作为 Filter,可以在 web.xml 中配置 HiddenHttpMethodFilter 的参数,可配置的参数为 methodParam,值必须为

GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE 中的一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值