这里的内容都是 [**https://gitee.com/binC_2016/getServiceImpls**](https://gitee.com/binC_2016/getServiceImpls)这个项目中


1 拦截器与过滤器的区别

  1. 拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
  2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  3. 拦截器只能对ACTION请求起作用,而过滤器则可以对几乎所有的请求起作用。

    执行顺序:过滤器->拦截器->切面

    过滤器、拦截器属于请求层面的拦截;切面属于方法层面的拦截过滤器拦截器执行顺序.png

  1. 拦截器可以访问ACTION上下文、值栈里的对象,而过滤器不能访问。
  2. 在ACTION的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  3. 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

2 过滤器(注意对比拦截器)

1 拦截器 过滤器对比

在讲Spring boot之前,我们先了解一下过滤器和拦截器。这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的。在分析两者的区别之前,我们先理解一下AOP的概念,AOP不是一种具体的技术,而是一种编程思想。在面向对象编程的过程中,我们很容易通过继承、多态来解决纵向扩展。 但是对于横向的功能,比如,在所有的service方法中开启事务,或者统一记录日志等功能,面向对象的是无法解决的。所以AOP——面向切面编程其实是面向对象编程思想的一个补充。而我们今天讲的过滤器和拦截器都属于面向切面编程的具体实现。而两者的主要区别包括以下几个方面:

  1. Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
  2. Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。
  3. Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

总结:这里主要对基于Spring boot对过滤器和拦截器的配置进行的讲解。无论是过滤器还是拦截器都属于AOP(面向切面编程)思想的具体实现。除了这两种实现我们还见过另一种更灵活的AOP实现技术,即Aspect,我们可以通过Aspect来完成更多更强大的功能。【即:《7 自定义注解 + 切面》】

2 过滤器实现过程

  1. 编写自己的过滤器,实现Filter
    com.binc.testspring.common.filter.BincFilterb

2.1. 方式一:通过 FilterRegistrationBean 配置来注册过滤器
com.binc.testspring.common.config.WebMvcConfig
2.2 方式二: 通过注解(两个方式都挺好的)

  1. @Order(1) // 如果有多个 Filter ,则序号越小 ,越旱被执行(这个没有试验过,并且这个spring核心包的并不是springboot的// )
  2. @WebFilter(urlPatterns = "/*", filterName = "logFilter2") 这个添加在自定义过滤器类上
  3. @ServletComponentScan("com.binc.testspring.common.filter") 这个添加在配置类或者启动类上

注意:@WebFilter这个注解并没有指定执行顺序的属性,其执行顺序依赖于Filter的名称,
是根据Filter类名(注意不是配置的filter的名字)的字母顺序倒序排列,并且@WebFilter指定的过滤器优先级都高于FilterRegistrationBean配置的过滤器。

3 拦截器开发 (配合自定义注解最好玩了)

这里的内容都是 [https://gitee.com/binC_2016/getServiceImpls](https://gitee.com/binC_2016/getServiceImpls)这个项目中

  1. 实现 HandlerInteceptor接口 或者 继承HandlerInterceptorAdapter 类
    com.binc.testspring.common.interceptor.BincInterceptor_first.java
  2. 重写需要的方法(拦截方法内容)
    com.binc.testspring.common.interceptor.BincInterceptor_first.preHandle()
  3. 自定义的拦截器 + 基于注解(正好实践一下自定义注解)
    【自定义的注解,这个注解的作用就是在拦截器里判断拦截到的方法是否有标注这个注解,一旦标注了这个注解,我们就认为他是我们要拦截的目标方法;然后开始各种的校验等】
  4. 拦截方法内容中判断是否有注解,有则。。无则。。 (这就是拦截器具体业务代码了)
  5. 添加配置类,将自定义拦截器添加到配置类中;

    三件重要的事情:

    1. 写一个拦截器配置类,配置类表上@Configuration这个注解,在启动的时候在会被加载
    2. 将自定义拦截器类注册到容器中,(这个写到任何一个配置类中都行,保证从容器上下文能获取到该bean就行了)
    3. 配置类实现WebMvcConfigurer !重写addInterceptors 方法,将自定义拦截器bean添加到拦截器链中】

WebMvcConfigurer接口的作用:

SpringBoot—-WebMvcConfigurer详解