SpringBoot2:请求处理原理分析-FORM表单请求接口
一、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
三、源码解读
对于web form表单请求,都归WebMvcAutoConfiguration管理
具体位置:
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实例。
@Beanpublic 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()的值。
相关文章:
SpringBoot2:请求处理原理分析-FORM表单请求接口
一、RESTFUL简介 Rest风格支持(使用HTTP请求方式,动词来表示对资源的操作) 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改…...
Monkey日志ANR、CRASH、空指针异常及其他异常数据分析
引言 在Android开发过程中,monkey测试是一种常用的随机测试手段,用于模拟用户的各种操作来发现应用中的稳定性问题。通过monkey测试生成的日志文件包含了丰富的信息,包括应用程序崩溃(Crash)、无响应(ANR&…...
Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区
在Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区(甚至到更细分的级别,如街道、小区等)的联动选择是一个常见的需求。Element Plus的Cascader组件非常适合这样的场景,因为它…...
使用卫星仿真软件STK的一些应用和思考(星地链路、星间链路)
目录 任务描述利用STK建模星地协同系统3个GEO高轨卫星240/20/1 Walker-Star Constellation 低轨卫星星座地面站或者地面设备 链路建模与数据提取处理星地链路星间链路数据读取的几种方法最麻烦的方法使用Matlab与STK互联接口使用大规模使用Chain 总结 任务描述 在一个星地协同…...
pytorch对不同的可调参数,分配不同的学习率
在 PyTorch 中,你可以通过为优化器传递不同的学习率来针对不同的可调参数分配不同的学习率。这通常通过向优化器传递一个字典列表来实现,其中每个字典指定特定参数组的学习率。下面是一个示例代码,展示了如何实现这一点: import …...
零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍
1. time模块 time():获取当前时间戳,是一个数字 localtime():返回一个time.struct_time对象,里面有年月日时分秒,还有星期几(0表示星期一)和今年的第几天 import timeprint(time.time()) pri…...
快速回顾-HTML5
HTML5-常用的标签:https://blog.csdn.net/TKOP_/article/details/111395865 <!-- HTML5:声明文档类型的标签 --> <!DOCTYPE html><!-- 用于声明网页的主要语言为简体中文 --> <!-- 帮助搜索引擎、浏览器等理解网页的语言内容,以便…...
视频技术未来展望:EasyCVR如何引领汇聚融合平台新趋势
随着科技的飞速发展,视频技术已成为现代社会不可或缺的一部分,广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。本文将探讨视频技术的未来发展趋势,并深入分析TSINGSEE青犀EasyCVR视频汇聚融合平台的技术优势,展现其…...
7个流行的开源数据治理工具
数字化时代,数据是已经成为最宝贵的资产之一。数据支撑着我们的政府、企业以及各类组织的所有流程,并为决策以及智能化服务提供支撑。大数据有大用途,但是也可能隐藏着巨大的风险,特别是如果我们对数据的情况不是很了解的时候&…...
js | XMLHttpRequest
是什么? 和serve交互数据的对象;能够达到页面部分刷新的效果,也就是获取数据之后,不会使得整个页面都刷新;虽然名字是XML,但不限于XML数据。 怎么用? function reqListener() {console.log(thi…...
2024国赛数学建模A题思路模型代码
2024国赛数学建模思路资料,思路获取见文末名片 数学建模感想 纪念逝去的大学数学建模:两次校赛,两次国赛,两次美赛,一次电工杯。从大一下学期组队到现在,大三下学期,时间飞逝,我的…...
使用SVD(奇异值分解)进行降维的奇妙之旅
在数据分析和机器学习的广阔天地中,降维技术占据着举足轻重的地位。当我们面对高维数据时,不仅计算成本高昂,而且容易遭遇“维度灾难”,即随着维度的增加,数据的稀疏性和距离度量失效等问题愈发严重。为了克服这些挑战…...
【C++ 第二十一章】特殊类的设计(学习思路)
1.请设计一个类,不能被拷贝 设计思路 拷贝只会使用在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 的做法 将拷贝构造函数与赋值运算符…...
Java设计模式【命令模式】-行为型
1. 介绍 命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使我们可以用不同的请求对客户端进行参数化,并且支持请求的排队、记录日志以及撤销、重做等功能。命令模式将请求的发送者与…...
【HarmonyOS】一键扫码功能
【HarmonyOS】一键扫码功能 前言 鸿蒙在api10之后,对系统api的基础上,封装了较为复杂功能的开发工具包,统一称之为Kit。这些Kit根据功能定义的不同,划分为不同的种类Kit。如下图所示: 其实可以理解为集成在系统中的…...
Spring Boot应用中集成与使用多数据源
Spring Boot应用中集成与使用多数据源 1. 前言 通过定义和使用多个数据源,能在Spring Boot应用中实现更复杂的数据管理场景,比如读写分离、数据冗余等。 2. 准备工作 环境准备:确保已经准备好Spring Boot的开发环境。数据库准备ÿ…...
探索 JavaScript 中的 instanceof 关键字
在 JavaScript 这门灵活而强大的编程语言中,instanceof 是一个非常重要的操作符,它用于检测一个对象是否在其原型链的原型构造函数的 prototype 属性中出现。简而言之,instanceof 用于测试一个对象是否是其父类或者其原型链上某个构造函数的实…...
Python爬虫02
xml 和html 区别 jsonpath模块 场景 多层嵌套的复杂字典直接提取数据 安装 pip install jsonpath使用 from jsonpath import jsonpathret jsonpath(dict, jaonpath语法规则字符串)语法规则 eg: lxml模块&xpath语法 谷歌浏览器 xpath helper 插件 作用对当前页面…...
HTTP/3
http相关知识点 HTTP/3是超文本传输协议(HTTP)的最新版本,旨在进一步提高Web性能和安全性。HTTP/3的显著变化是它基于QUIC(Quick UDP Internet Connections)协议,而不是之前版本中使用的TCP协议。QUIC是由…...
MySQL 字符串操作详解和案例示范
MySQL 字符串操作详解 MySQL 提供了丰富的字符串操作函数,能够对这些字符串进行截取、定位、替换等操作。本文将详细讲解 MySQL 中的字符串操作函数,包括 SUBSTRING()、SUBSTR()、LEFT()、RIGHT()、LOCATE()、POSITION()、FIND_IN_SET()、ELT()、INSERT…...
mPLUG图文交互企业落地:医疗影像辅助说明、工业图纸问答系统实践
mPLUG图文交互企业落地:医疗影像辅助说明、工业图纸问答系统实践 1. 项目核心价值:让机器“看懂”图片并回答你的问题 想象一下,你是一位医生,面对一张复杂的X光片,需要快速判断病灶位置和特征;或者你是一…...
5个高效获取免费内容的全平台解决方案
5个高效获取免费内容的全平台解决方案 在信息爆炸的时代,优质内容往往被付费墙阻隔。本文将从需求场景、工具选择、跨设备配置到风险控制,为你提供一套完整的免费内容获取指南,帮助你在不同场景下高效获取所需信息。 [需求场景诊断]ÿ…...
电机模型、电流环PI控制器、PLL锁相环的标幺化处理及采样时间详解
电机标幺化、PI标幺化、锁相环PLL标幺化 详解电机模型相关标幺化处理 电流环PI控制器的标幺化处理 观测器中PLL锁相环的标幺化处理 采样时间处理 这是文档,不是代码,文档中的代码均为引用举例子的在电机控制的世界里,标幺化处理是一个绕不开的…...
GTE-Base-ZH镜像体验:可视化界面+API,双模式交互更便捷
GTE-Base-ZH镜像体验:可视化界面API,双模式交互更便捷 1. 模型与镜像介绍 1.1 GTE模型背景 GTE(General Text Embedding)模型是由阿里巴巴达摩院研发的文本嵌入模型系列,基于BERT框架构建。该系列模型在大规模中文和…...
你的SSH密钥可能已经过期了评
引言 在现代软件开发中,性能始终是衡量应用质量的重要指标之一。无论是企业级应用、云服务还是桌面程序,性能优化都能显著提升用户体验、降低基础设施成本并增强系统的可扩展性。对于使用 C# 开发的应用程序而言,性能优化涉及多个层面&#x…...
OpenClaw备份恢复指南:Phi-3-vision-128k技能配置迁移技巧
OpenClaw备份恢复指南:Phi-3-vision-128k技能配置迁移技巧 1. 为什么需要备份OpenClaw环境 上周我的主力开发机突然硬盘故障,不得不紧急更换设备。当我面对一台全新的MacBook Pro时,最头疼的不是重装开发环境,而是如何恢复那个精…...
大模型“入侵”广告推荐
引言:一次失败的“All in LLM”实验去年,某头部信息流平台进行了一次激进的实验:尝试用一个大语言模型(LLM)完全替换其精排层的深度模型。核心逻辑是:既然LLM能理解一切,那么理解用户和内容&…...
Loom上线前必须做的6项静态检查+4类动态熔断配置(GitHub星标开源Checklist)
第一章:Loom响应式编程转型的必要性与风险全景图随着微服务架构深度演进与实时数据流场景爆发式增长,传统阻塞式I/O与线程模型在高并发、低延迟诉求下日益暴露瓶颈。Project Loom引入虚拟线程(Virtual Threads)与结构化并发原语&a…...
AI开发-python-langchain框架(--AI 直接生成并执行 Python 代码 )友
指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...
如何处理死锁异常_ORA-00060捕获与重试机制设计
ORA-00060是死锁,非单纯竞争;Oracle检测到多个会话互持对方所需锁并主动回滚其中一个事务,需通过trace文件分析Deadlock graph定位具体行锁冲突及session,不可盲目重试。ORA-00060 是死锁还是竞争?先看日志里真正冲突的…...
