当前位置: 首页 > article >正文

SpringBoot2:请求处理原理分析-RESTFUL风格接口

一、RESTFUL简介

Rest风格支持(使用HTTP请求方式,动词来表示对资源的操作)
以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户
现在: /user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户

可以简单理解为,请求接口的路径就1个,但是,提交请求时,多了一个参数,从而定位到后端的具体接口。

二、案例

controller接口

    @RequestMapping(value = "/user",method = RequestMethod.GET)
    public String getUser(){
        return "GET-张三";
    }

    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String saveUser(){
        return "POST-张三";
    }

    @RequestMapping(value = "/user",method = RequestMethod.PUT)
    public String putUser(){
        return "PUT-张三";
    }

    @RequestMapping(value = "/user",method = RequestMethod.DELETE)
    public String deleteUser(){
        return "DELETE-张三";
    }

form表单请求
用法: 对于put、delete、patch类型请求,表单method=post,隐藏域 _method=put

<form action="/user" method="get">
    <input value="REST-GET 提交" type="submit"/>
</form>
<form action="/user" method="post">
    <input value="REST-POST 提交" type="submit"/>
</form>
<form action="/user" method="post">
    <input name="_method" type="hidden" value="delete"/>
    <input value="REST-DELETE 提交" type="submit"/>
</form>
<form action="/user" method="post">
    <input name="_method" type="hidden" value="PUT"/>
    <input value="REST-PUT 提交" type="submit"/>
</form>

yml开启配置

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

三、源码解读

我们知道,springboot的接接口入口是DispatcherServlet类。
web请求的自动配置类是WebMvcAutoConfiguration
那么,springboot是复合区分不同类型的请求了?
我们看下WebMvcAutoConfiguration配置类信息
有个条件装配HiddenHttpMethodFilter。而filter的优先级是高于servlet接口的。
所以,请求来了,会先进入filter处理。

具体位置:
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration#hiddenHttpMethodFilter
在这里插入图片描述
org.springframework.web.filter.HiddenHttpMethodFilter#doFilterInternal
主要处理逻辑代码
在这里插入图片描述
代码解释:
put、delete、patch必须以post form表单的影藏参数传到后端,才能正常处理。
this.methodParam
在这里插入图片描述
ALLOWED_METHODS
在这里插入图片描述

四、扩展

我们注意到this.methodParam变量
在这里插入图片描述
它提供了对应的set方法,所以,我们可以修改这个值,来将影藏参数改成自己喜欢的样子。

此时,需要借助配置类,向IOC容器中,注册一个HiddenHttpMethodFilter,并set我们自定义的值。
来覆盖springboot自动装配的Bean实例

    @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
        HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
        methodFilter.setMethodParam("_hiddenParam");
        return methodFilter;
    }

我们注意到,源码的一个判断逻辑
"POST".equals(request.getMethod())
那么,如果form表单提交的method=put、delete、patch是不是就直接放行了呢?
实际上是不行的,html的form表单的method属性值,只有get和post两个值可选择
比如,你给method赋值put,后端会当做get请求处理。

另外,如果我们用Postman客户端工具发送put请求,那么,就可以直接放行。
客户端工具,直接修改了request.getMethod()的值。


http://www.kler.cn/a/294429.html

相关文章:

  • 由播客转向个人定制的音频频道(1)平台搭建
  • 分布式----Ceph部署
  • Redis五种数据类型剖析
  • 速盾:游戏盾的功能和原理详解
  • 【数据结构】线性表——链表
  • 如何选择最适合的自闭症干预机构?
  • 交换机自动化备份配置(H3C_无人值守)
  • 前端小白操作指南:如何删除项目中 pre-commit 的提交限制?
  • 【机器人工具箱Robotics Toolbox开发笔记(十五)】六自由度机器人笛卡尔空间轨迹规划仿真实例
  • 过去十年中,深度学习领域经历了许多重要的算法创新和突破。以下是一些关键的深度学习算法,按照时间顺序排列:
  • ChatGPT在医疗行业的应用前景与挑战探析
  • GraphRAG入门:基本概念、应用场景及学习方法
  • 2024国赛数学建模A题B题C题D题E题思路资料模型
  • yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距
  • AI基础 L1 Introduction to Artificial Intelligence
  • Prometheus + Grafana + nVisual 实现运维监控全面可视化
  • 【区块链 + 物联网】基于电子标签的区块链溯源系统 | FISCO BCOS应用案例
  • QT Android开发之Android端usb调试模式设置与问题解决
  • 分类算法可视化方法
  • 【机器学习】表示学习的基本概念和方法以及编解码结构的基本概念
  • C++设计模式之:单例模式singleton
  • HTTP 一、基础知识
  • iOS18 beta版本怎么回退至iOS17正式版本?
  • 软考(计算机技术与软件专业技术资格(水平)考试)
  • StyleGAN——生成风格化的视频内容,特别是在艺术视频或动画领域,可以将视频的视觉风格转换为特定的艺术风格
  • 鸿蒙MPChart图表自定义(四)短刻度线