三、通过配置过滤器让普通浏览器支持PUT,DELETE请求

要实现delete和put的约定或者是要实现过滤的条件:

1.请求方式必须为post

2.必须要有隐藏域,并且隐藏域的name属性 = “_method” value = "Delete/put"

 

一、在web.xml中配置过滤器

 

<!--配置过滤器-->

<filter>

<filter-name>HiddenHttpMethodFiler</filter-name>

<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>

</filter>

 

<filter-mapping>

<filter-name>HiddenHttpMethodFiler</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

二、在前端表单设置好约定

要实现delete和put的约定或者是要实现过滤的条件:

1.请求方式必须为post

2.必须要有隐藏域,并且隐藏域的name属性 = “_method” value = "Delete/put"

<form action="handler/select/234" method="get">

<input type="submit" value="查询">

</form>

 

<form action="handler/update/345" method="post">

<input type="hidden" name="_method" value="DELETE"><%--设置隐藏域,用于实现DELETE方式提交--%>

<input type="submit" value="删除">

</form>

 

<form action="handler/delete/456" method="post">

<input type="hidden" name="_method" value="PUT"><%--设置隐藏域,用于实现PUT方式提交--%>

<input type="submit" value="修改">

</form>

 

三、在控制层

 

@RequestMapping(value = "update/{id}",method = RequestMethod.PUT)

public String update(@PathVariable("id") Integer id){

System.out.println("update:修改"+id);

return "success";

}

 

@RequestMapping(value = "delete/{id}",method = RequestMethod.DELETE)

public String delete(@PathVariable("id") Integer id){

System.out.println("delete:删除"+id);

return "success";

}

 

过滤器中 处理put|delete请求的部分源码:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)

            throws ServletException, IOException {

 

        HttpServletRequest requestToUse = request;

 

        if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {

            String paramValue = request.getParameter(this.methodParam);

            if (StringUtils.hasLength(paramValue)) {

                requestToUse = new HttpMethodRequestWrapper(request, paramValue);

            }

        }

 

        filterChain.doFilter(requestToUse, response);

    }

原始请求:request,改请求默认只支持get post  header

但是如果 是"POST"  并且有隐藏域        <input type="hidden"  name="_method" value="DELETE"/>

则,过滤器 将原始的请求 request加入新的请求方式DELETE,并将原始请求 转为 requestToUse 请求(request+Delete请求)

最后将requestToUse 放入 请求链中, 后续再事情request时  实际就使用改造后的 requestToUse

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值