Spring拦截器和过滤器

Spring的过滤器Filter和拦截器HandlerInterceptor有什么区别

Filter和HandlerInterceptor是Spring框架中用于实现请求过滤和拦截的两种机制,它们有以下区别:
执行顺序:
Filter是Servlet规范中定义的过滤器,它的执行顺序是在请求进入Servlet容器之前先执行,然后再由容器将请求传递给对应的Servlet或Controller进行处理。在响应返回给客户端之前,过滤器还会执行一次。
HandlerInterceptor是Spring框架提供的拦截器,它的执行顺序是在请求进入Controller之前执行,然后再由Controller进行处理。在Controller处理完请求后,拦截器还会执行一次。
作用范围:
Filter可以对所有的请求进行过滤,包括静态资源文件(如HTML、CSS、JavaScript等)和动态请求(如Servlet请求、Spring MVC请求等)。
HandlerInterceptor只能对Spring MVC的请求进行拦截,无法对静态资源文件进行拦截。
配置方式:
Filter的配置是通过在web.xml或Servlet注册类中配置,需要在配置文件中指定过滤器的顺序和URL匹配规则。
HandlerInterceptor的配置是通过实现WebMvcConfigurer接口,并重写addInterceptors方法来添加拦截器。也可以直接在Spring Boot中使用注解@Configuration和实现WebMvcConfigurer接口的方式来配置拦截器。
功能:
Filter可以进行更底层的操作,例如直接操作请求和响应对象,修改请求参数或响应内容,实现对请求和响应的完全自定义处理。
HandlerInterceptor提供了更高级的功能,例如在Controller处理前和处理后进行预处理、后处理、完成处理,可以对请求进行修改、记录日志、权限验证等。
总的来说,Filter是Servlet规范定义的一种过滤器机制,在请求进入容器之前和响应返回客户端之前进行拦截和处理;而HandlerInterceptor是Spring框架提供的一种拦截器机制,主要用于对Spring MVC请求进行拦截和处理。两者可以根据需求选择使用,但需要注意配置的方式和作用范围的差异。

在Spring框架中,有一些常用的过滤器和拦截器,它们的执行顺序如下:

过滤器(Filter)的执行顺序:
CharacterEncodingFilter:设置请求和响应的字符编码。
HiddenHttpMethodFilter:将POST请求转换为对应的HTTP方法。
HttpPutFormContentFilter:将PUT请求中的表单数据包装成请求参数。
RequestContextFilter:将请求上下文绑定到当前线程。
FormContentFilter:将请求体中的表单数据包装成请求参数。
MultipartFilter:处理请求中的文件上传。
OpenEntityManagerInViewFilter:将EntityManager与当前线程绑定,用于实现Open EntityManager in View模式。
DelegatingFilterProxy:委托给另外一个过滤器进行处理。

拦截器(HandlerInterceptor)的执行顺序:
HandlerInterceptor的preHandle方法:在Controller方法执行前执行的拦截器逻辑。
Controller中的方法:执行具体的请求处理逻辑。
HandlerInterceptor的postHandle方法:在Controller方法执行后、视图渲染前执行的拦截器逻辑。
视图渲染:将模型数据渲染到视图中。
HandlerInterceptor的afterCompletion方法:在视图渲染完成后执行的拦截器逻辑。
需要注意的是,拦截器的执行顺序是根据配置的顺序来确定的。如果有多个拦截器,可以通过实现WebMvcConfigurer接口,重写addInterceptors方法来指定拦截器的顺序。
此外,过滤器和拦截器的执行顺序是在请求处理流程中的不同阶段进行的。过滤器在请求进入Servlet容器之前和响应返回客户端之前执行,而拦截器在Controller方法执行前和视图渲染前后执行。因此,过滤器可以对所有请求进行过滤处理,而拦截器只能对Spring MVC请求进行拦截和处理。

posted @ 2023-06-30 10:06  清泉白石  阅读(114)  评论(0编辑  收藏  举报