@关于发送put、delete、patch请求底层实现过程
对于put这些请求,我们无法直接通过form表单发送,form表单仅支持get和post请求;
虽然我们无法直接通过form表单发送这些请求,但我们可以以form表单为载体做二次请求:使用form表单发送put等请求时,必须指定form表单的请求方式为post,且必须携带一个名为’_method’的参数,其值为真正的请求方式
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zzLz1bo1-1671457297396)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219205347287.png)]](https://img-blog.csdnimg.cn/ed0dc31194fd4bb0a1ca6620c28a561b.png)
当我们使用这种方式去发送一个请求时,应创建HiddenHttpMethodFilter过滤器,在发送请求时,先进行过滤,将请求转化,再响应对应的servlet(过滤器在servlet之前执行);
大致分析一下请求过滤器对请求转换的过程:
HiddenHttpMethodFilter的继承结构
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jExWHq44-1671457297397)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219210540328.png)]](https://img-blog.csdnimg.cn/fb2512363fbb4b439fb71abd2dcca01e.png)
我们知道,在监听器中有一个核心方法叫做doFilter,它用于处理过滤操作并放行。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvjfgqdT-1671457297398)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219211008550.png)]](https://img-blog.csdnimg.cn/2fd4423077a2472a992021a55ce13da3.png)
上面的doFilder方法在HiddenHttpMethodFilter的父类OncePerRequestFilter中,HiddenHttpMethodFilter继承了这个方法,在处理请求转换的操作中,HiddenHttpMethodFilter会先执行从父类中的继承来的doFilder,然后再执行到图中标记的doFilderInternal方法,这个方法是HiddenHttpMethodFilter自己的方法,而请求转换的操作就是在这个方法中执行。

根据源码分析:在转换请求时,需要先判断当前请求是否为post请求并且没有异常发生,然后,获取请求参数’_method’的值,判断其是否为有效数据(长度、大小写转换),当这些都没有问题,执行以下判断
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s39aSRoS-1671457297400)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219213538657.png)]](https://img-blog.csdnimg.cn/7db41524869b48f7a452cb24c6692ba1.png)
这里的ALLOWED_METHODS是一个List集合,在类中有一个静态代码块会对ALLOWED_METHODS进行初始化
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-im6grMJ7-1671457297401)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219213743232.png)]](https://img-blog.csdnimg.cn/634054815e70485fb330f4fa09d46ad0.png)
默认请求有三个:分别为PUT、DELETE、PATCH
当method属于其中任意请求时,执行HttpMethodRequestWrapper方法进行请求转换
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6aA9ANz6-1671457297402)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219214055818.png)]](https://img-blog.csdnimg.cn/150728d765dc4693863a5d5311a9d909.png)
至此、请求转换完成。
![[附源码]计算机毕业设计Node.js宠物商店管理系统(程序+LW)](https://img-blog.csdnimg.cn/981d9d72aadb4e538cd005d96fda4ccd.png)


















