写点什么

SpringMVC 中 Http 请求方式转换(post 转换为 put/delete 等方式)

用户头像
知春秋
关注
发布于: 2020 年 06 月 12 日

springmvc 的请求方式支持

​ 在 springmvc 中,提供了@RequestMapping注解帮助我们快速配置一个 handler 处理器。同时提供了method属性支持定义请求方式。如:@RequestMapping(value = "/handle",method = {RequestMethod.POST})。该 url:/handle 只支持 post 的请求方式。

springmvc 对 Restful 风格的支持

​ 我们都知道 springmvc 已经对 Restful 风格的 url 提供了支持,Restful 建议使用postgetdeleteput四种请求方式分别对资源进行增加、查询、删除、修改操作。

​ 在 springmvc 开发中,我们可以使用@RequestMapping注解定义 Restful 风格的支持,或者@PostMapping@GetMapping@DeleteMapping@PutMapping等注解。

​ 但是我们开发中一般使用postget请求方式。对于deleteput基本不会使用,因为这两种请求方式不安全。

问题点

​ 在 Restful 风格中,需要我们对删除和修改分别使用deleteput方式请求。如果我们使用了这两种请求方式,那么的确符合了 Restful 风格,但是存在风险。如果不使用我们设计的接口 URL 就不是 Restful 风格的。

解决方案

​ springmvc 就是基于这个问题提供了解决方案。你可以使用post方式请求接口,但是 web 应用中可以配置过滤器来将请求方式转换。

好处

  • 接口调用者使用post这种安全的方式请求 web 应用提供的接口

  • web 应用内部接口定义putdelete等方式请求,符合 Restful 风格规范

  • 接口调用者使用post请求到 web 应用使用putdelete请求方式接受的处理交给 springmvc 提供的过滤器

开发流程

  1. web.xml 中配置过滤器org.springframework.web.filter.HiddenHttpMethodFilter(如果是 spring-boot 搭建的项目参考 spring-boot 对于 Filter 的配置就可以了)

  2. 对于putdelete请求的时候使用post方式请求,同时增加一个参数_method=delete,定义实际的请求方式

代码

web.xml 配置文件

<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>
复制代码

java 代码

/* * restful  delete方式  /demo/handle/15 */@RequestMapping(value = "/handle/{id}",method = {RequestMethod.DELETE})public ModelAndView handleDelete(@PathVariable("id") Integer id) {    Date date = new Date();    ModelAndView modelAndView = new ModelAndView();    modelAndView.addObject("date",date);    modelAndView.setViewName("success");    return modelAndView;}
复制代码

请求 url

post 方式请求:http://localhost:8080/demo/handle/1?_method=delete

注意 对于请求方式的转换不要用 get,要用 post 请求才可以转换


发布于: 2020 年 06 月 12 日阅读数: 99
用户头像

知春秋

关注

不忘初心,方得始终。初心易得,始终难守。 2020.04.29 加入

Java高级工程师,从业多年主要负责互联网电商、金融系统开发与架构设计。对分布式存储、分布式缓存、分布式消息中间件、分布式搜索引擎 / 实时流式计算、容器技术有一定的研究和认识,对主流开源框架源码熟悉。

评论

发布
暂无评论
SpringMVC中Http请求方式转换(post转换为put/delete等方式)