@关于发送put、delete、patch请求底层实现过程
对于put这些请求,我们无法直接通过form表单发送,form表单仅支持get和post请求;
虽然我们无法直接通过form表单发送这些请求,但我们可以以form表单为载体做二次请求:使用form表单发送put等请求时,必须指定form表单的请求方式为post,且必须携带一个名为’_method’的参数,其值为真正的请求方式
当我们使用这种方式去发送一个请求时,应创建HiddenHttpMethodFilter过滤器,在发送请求时,先进行过滤,将请求转化,再响应对应的servlet(过滤器在servlet之前执行);
大致分析一下请求过滤器对请求转换的过程:
HiddenHttpMethodFilter的继承结构
我们知道,在监听器中有一个核心方法叫做doFilter,它用于处理过滤操作并放行。
上面的doFilder方法在HiddenHttpMethodFilter的父类OncePerRequestFilter中,HiddenHttpMethodFilter继承了这个方法,在处理请求转换的操作中,HiddenHttpMethodFilter会先执行从父类中的继承来的doFilder,然后再执行到图中标记的doFilderInternal方法,这个方法是HiddenHttpMethodFilter自己的方法,而请求转换的操作就是在这个方法中执行。
根据源码分析:在转换请求时,需要先判断当前请求是否为post请求并且没有异常发生,然后,获取请求参数’_method’的值,判断其是否为有效数据(长度、大小写转换),当这些都没有问题,执行以下判断
这里的ALLOWED_METHODS是一个List集合,在类中有一个静态代码块会对ALLOWED_METHODS进行初始化
默认请求有三个:分别为PUT、DELETE、PATCH
当method属于其中任意请求时,执行HttpMethodRequestWrapper方法进行请求转换
至此、请求转换完成。