Filter和Interceptor一些区别

Filter和Interceptor一些区别

捡破烂的诗人 755 2022-12-05
  • 联系方式:1761430646@qq.com
  • 编写时间:2022年12月5日21:20:19
  • 博客地址:www.zeroeden.cn
  • 菜狗摸索,有误勿喷,烦请联系

1. 使用

  • 默认已经搭建好了SpringBoot环境

1.1 SpringBoot 整合 Filter

  • 编写一个过滤器实现Filter接口并且实现其方法,然后生成Bean即可

  • 方法说明:

    • init()生成过滤器时执行的一些初始化动作

    • doFilte()执行的过滤逻辑处理

      • 调用过滤器链filterChain的doFilter()方法即可将请求放行进入到下一个阶段
      • filterChain.doFilter()后的代码为在响应传回客户端前经过过滤器时的一些处理逻辑(比如说可以设置字符串编码之类的)
    • destroy()过滤器销毁时执行的一些操作

  • 执行流程–发送请求访问控制层的方法

1.2 SpringBoot 整合 Interceptor

  • 编写一个拦截器类实现HandlerInterceptor接口,并且重写接口中的方法,接着生成Bean

  • 最后在实现WebMvcConfigurer接口的配置类中在对应方法上添加拦截器并配置拦截路径

  • 方法说明

    • preHandle()在进入到控制层方法执行之前做的一些逻辑处理(返回值为true则放行,false则被拦截掉)
    • postHandle()在控制层方法执行完后做的一些逻辑处理
    • afterCompletion()在视图渲染后做的一些处理
  • 执行流程–发送请求访问控制层的方法

2. 区别

  1. "出身"不同-过滤器Filter来自Servlet,而拦截器Interceptor来自Spring

  2. 支持的项目类型不同

    • 由于过滤器是Servlet规范中定义的,所以过滤器依赖Servlet容器,只能用在Web项目中
    • 而拦截器是Spring框架的其中一个组件,Spring框架本身不仅只限于运用在Web项目中,所以拦截器还可以运行在ApplicationSwing程序中
  3. 触发时机不同

    • 如下是FilterInterceptor都配置时的执行流程

    • 请求执行过程如下图(暂时不理InterceptorafterCompletion()方法)

    • 小结

      • 也就是请求会先到Filter–>然后到Interceptor–>最后到Controller

      • 响应回来时同理

      • 网上常挂上的一张图

  4. 使用业务场景不同

    • 从上面可以知道,请求会先达到Filter,然后才是Interceptor
    • 也就是说FilterController比较远,InterceptorController比较近,更接近业务系统
    • 所以,Interceptor主要是用来实现项目中的业务判断的,比如【登录、权限判断】、【日志记录】等
    • Filter主要是用来实现通过功能过滤的,比如【敏感词过滤】、【字符集编码设置】等
  5. 实现原理不同

    • Filter是基于方法回调实现的
    • Interceptor是基于反射(动态代理)实现的

# Spring # SpringBoot # 过滤器 # Filter # Interceptor # 拦截器 # 区别