一,过滤器 Filter
- 1, Filter(过滤器)是J2EE的规范,Servlet2.3开始引入/实现的是职责链模式。多个过滤器形成一个过滤器链。
- 2, 实现Filter接口,分别有init()用于完成过滤器的初始化,destroy() 用于过滤器销毁前,完成某些资源的回收,doFilter()实现过滤功能,对每个请求增加额外的处理。
- 3, 基于 Servlet,通过函数回调方式实现,可以过滤请求和图片文件等,每个请求一个过滤器只能过滤一次。
- 4,
器拦截web访问url地址
严格意义上讲,filter只是适用于web中,依赖于Servlet容器,利用Java的回调机制进行实现。
应用场景
1,用户访问权限处理;
2,设置字符集乱码处理;
3,过滤敏感词汇、压缩响应信息
二,拦截器 Interceptor
- 1, 基于SpringMVC,基于java 的反射机制,代理模式实现;
- 2, java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。
- 3, 实现HandlerInterceptor接口有三个方法,分别为在业务处理器处理请求之前被调用(preHandle()),在业务处理器处理完请求后(postHandle()),完全处理完请求后被调用(afterCompletion())。
- 4, 只能拦截请求,可以访问上下文等对象,功能强大,一个请求可多次拦截。
应用场景
1,全局日志管理
2,用户访问权限处理
相关文章:
SpringBoot使用拦截器替代AOP实现日志记录
三,AOP
- 1, 面向切面拦截的是类的元数据(包、类、方法名、参数等),相对于拦截器更加细致,而且非常灵活,拦截器只能针对URL做拦截,而AOP针对具体的代码,能够实现更加复杂的业务逻辑。
- 2, Spring AOP和拦截器一样,都是AOP的实现方式的一种,均使用
代理模式
实现。 - 3, 拦截器只对 action 负责,作用层面一般位于 Controller 层,Spring AOP 主要是拦截对 Spring 管理的 Bean 的访问,
一般作用与 Service 层
。 - 4, Spring AOP的注解有
@Before、@After、@AfterReturning、@AfterThrowing、@Around,
可以更灵活的配置要监听处理的Bean。
四,过滤器和拦截器的区别
过滤器和拦截器,这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的。
我们先理解一下AOP的概念,AOP不是一种具体的技术,而是一种编程思想。在面向对象编程的过程中,我们很容易通过继承、多态来解决纵向扩展。
但是对于横向的功能,比如,在所有的service方法中开启事务,或者统一记录日志等功能,面向对象的是无法解决的。所以AOP——面向切面编程其实是面向对象编程思想的一个补充。
过滤器和拦截器都属于面向切面编程的具体实现
。而两者的主要区别包括以下几个方面:
- Filter 是依赖于
Servlet容器
,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。 - Filter 的执行由 Servlet 容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。
- Filter 的生命周期由 Servlet 容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。
- 在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
五,拦截器和AOP区别
AOP是基于动态代理,生成一系列的代理类,效率较慢。而拦截器是基于SpringMVC,在SpringMVC工作流程中的执行方法action前后加上执行的代码,效率高。
六,执行顺序:
执行顺序:过滤器 -> 拦截器 -> AOP
拦截方向和抛出异常方向图:
小结
拦截器相比过滤器有更细粒度的控制,依赖于Spring容器,可以在请求之前或之后启动,过滤器主要依赖于servlet,过滤器能做的,拦截器基本上都能做。
评论区