SpringBoot中的Fliter和Interceptor

两者区别

两者区别:

  • Filter属于servlet组件, interceptor属于Spring内置组件
  • 多个Filter存在时按照文件的排列顺序依次执行
  • Filter会拦截所有的资源而interceptor只拦截Spring环境中的资源
  • Filter的执行流程在interceptor之前, 也就是先执行过滤器再执行拦截器

执行流程图如下:

image-20230410143454632

Filter实现

  1. 第一步 定义过滤器, 实现servlet包下的Filter接口, 并重写其所有方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    @WebFilter(urlPatterns = ["/*"])
    class LoginFilter:Filter {
    /**
    * 请求拦截
    */
    override fun doFilter(
    request: ServletRequest?,
    response: ServletResponse?,
    chain: FilterChain?
    ) {


    //放行
    chain?.doFilter(request,response)
    }

    /**
    * 服务启动时调用 只调用一次
    */
    override fun init(filterConfig: FilterConfig?) {
    super.init(filterConfig)

    }

    /**
    * 服务关闭时调用
    */
    override fun destroy() {
    super.destroy()
    }
    }
  1. 第二步 项目启动入口类上添加@ServletComponentScan开启servlet组件支持

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @ServletComponentScan /
    @SpringBootApplication
    open class MainApplication {
    companion object {
    @JvmStatic
    fun main(args: Array<String>) {

    SpringApplication.run(MainApplication::class.java, *args)
    }
    }


    }

Interceptor实现

  1. 第一步 定义拦截器, 实现HandlerInterceptor接口 并重写其所有方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    @Component
    class LoginCheckInterceptor :HandlerInterceptor {

    /**
    * 在目标方法执行前执行 返回true放行 否则不放行
    */
    override fun preHandle(
    request: HttpServletRequest,
    response: HttpServletResponse,
    handler: Any
    ): Boolean {
    return true
    }
    /**
    * 在目标方法执行后执行
    */
    override fun postHandle(
    request: HttpServletRequest,
    response: HttpServletResponse,
    handler: Any,
    modelAndView: ModelAndView?
    ) {
    }
    /**
    * 最后执行
    */
    override fun afterCompletion(
    request: HttpServletRequest,
    response: HttpServletResponse,
    handler: Any,
    ex: Exception?
    ) {
    }
    }
  1. 第二步 创建配置类 并将刚定义的拦截器添加进配置类中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Configuration
    open class WebConfig : WebMvcConfigurer {

    @Autowired
    lateinit var loginCheckInterceptor: LoginCheckInterceptor

    override fun addInterceptors(registry: InterceptorRegistry) {
    registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**") //拦截所有路径
    }
    }

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%