拦截器(Interpretor)过滤器(Filter) 切面(AOP)执行顺序及区别

Interpretor

概念解释:顾名思义拦截器

实现原理
Interpretor依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用

实现

MyInterceptor implements HandlerInterceptor:
preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView
afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);

使用场景:统一对http请求进行处理,监控controller执行时间、次数、鉴权、

优缺点:由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

Filter

概念:过滤器

实现原理
和拦截器的最大区别是:它依赖于servlet容器。,它可以对几乎所有请求进行过滤,获取我们想要获取的数据,在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作

使用方式:在实现上,基于函数回调

MyFilter extends Filter
@Override
    protected void doFilter()){}

使用场景:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器))

优缺点:一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作。基于servlet容器

AOP

概念:面向切面编程

实现原理:jdk代理、cjlib代理、反射

使用方式:比较多,可以是ControllerAdvise 或者 增加的模式:@Before、@Around、@After、@AfterThrow…

使用场景:方法性能监控、异常监控、事务、方法统一前置、后置、异常处理

优缺点:基于spring框架,不可以处理静态资源请求、相对于Filter可以重复执行

Interpretor、Filter、AOP执行顺序:

参考文章:
https://blog.csdn.net/sinat_18114869/article/details/80181648
https://blog.csdn.net/zhibo_lv/article/details/81699360
https://blog.csdn.net/zxd1435513775/article/details/80556034