form表单发送put、delete、patch请求的实现过程

@关于发送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)]

当我们使用这种方式去发送一个请求时,应创建HiddenHttpMethodFilter过滤器,在发送请求时,先进行过滤,将请求转化,再响应对应的servlet(过滤器在servlet之前执行);

大致分析一下请求过滤器对请求转换的过程:
HiddenHttpMethodFilter的继承结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jExWHq44-1671457297397)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219210540328.png)]

我们知道,在监听器中有一个核心方法叫做doFilter,它用于处理过滤操作并放行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvjfgqdT-1671457297398)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219211008550.png)]

上面的doFilder方法在HiddenHttpMethodFilter的父类OncePerRequestFilter中,HiddenHttpMethodFilter继承了这个方法,在处理请求转换的操作中,HiddenHttpMethodFilter会先执行从父类中的继承来的doFilder,然后再执行到图中标记的doFilderInternal方法,这个方法是HiddenHttpMethodFilter自己的方法,而请求转换的操作就是在这个方法中执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ErtNuAzr-1671457297399)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219213122718.png)

根据源码分析:在转换请求时,需要先判断当前请求是否为post请求并且没有异常发生,然后,获取请求参数’_method’的值,判断其是否为有效数据(长度、大小写转换),当这些都没有问题,执行以下判断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s39aSRoS-1671457297400)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219213538657.png)]

这里的ALLOWED_METHODS是一个List集合,在类中有一个静态代码块会对ALLOWED_METHODS进行初始化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-im6grMJ7-1671457297401)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219213743232.png)]

默认请求有三个:分别为PUT、DELETE、PATCH

当method属于其中任意请求时,执行HttpMethodRequestWrapper方法进行请求转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6aA9ANz6-1671457297402)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20221219214055818.png)]

至此、请求转换完成。

HTML 中的 form 元素有以下几种方法: 1. GET 方法:使用 GET 方法提交表单时,表单数据会附加在 URL 后面,以查询字符串的形式发送到服务器。GET 方法适合用于获取数据的场合,比如搜索、过滤等。GET 方法不适合用于提交敏感数据,因为 URL 会被保存在浏览器历史记录中,容易被恶意利用。 ```html <form action="/search" method="get"> <input type="text" name="q"> <button type="submit">搜索</button> </form> ``` 2. POST 方法:使用 POST 方法提交表单时,表单数据会作为请求发送到服务器。POST 方法适合用于提交、修改数据的场合,比如注册、登录等。POST 方法相对安全,因为请求体不会被保存在浏览器历史记录中。 ```html <form action="/login" method="post"> <label>用户名:<input type="text" name="username"></label> <label>密码:<input type="password" name="password"></label> <button type="submit">登录</button> </form> ``` 3. PUT 方法:使用 PUT 方法提交表单时,会将整个表单数据作为请求发送到服务器,用于更新资源。但是,HTML 中的 form 元素不支持 PUT 方法,需要借助 JavaScript 或其他工具库实现。 4. DELETE 方法:使用 DELETE 方法提交表单时,会删除指定资源。但是,HTML 中的 form 元素同样不支持 DELETE 方法,需要借助 JavaScript 或其他工具库实现。 5. PATCH 方法:使用 PATCH 方法提交表单时,会对指定资源进行局部更新。HTML 中的 form 元素同样不支持 PATCH 方法,需要借助 JavaScript 或其他工具库实现。 除了以上几种方法,还有一些其他的 HTTP 方法,如 HEAD、OPTIONS、CONNECT、TRACE 等,但它们不常用于表单提交。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值