- 前言
在工作看到一些逻辑是通过拦截器实现的,个人比较习惯使用AOP处理公共逻辑,所以查阅一些资料源码,理解 过滤器、拦截器、AOP的区别。
- 过滤器
- 基于java的函数回调,依赖于servlet容器。
- 拦截的是URL,对所有的请求都起作用。 当请求到达web容器时,会检测当前请求地址是否配置有过滤器,有则调用该过滤器的方法(可能会有多个过滤器),然后执行具体业务代码。
-
拦截器无法定义此拦截器在业务代码前还是在业务代码后执行,当请求到达时,就会立即执行。
-
过滤器可以对request和response进行过滤和修改。
-
仅在servlet中初始化调用一次
-
可以用来设置字符集、控制权限、控制转向等等。
-
拦截器
-
基于Java反射,代理模式,不依赖servlet容器。
-
拦截的是URL,可以对拦截的方法进行执行前、渲染前,渲染后三个方法
-
仅对action起作用,静态资源文件不起作用。
-
可以被多次调用
-
可以使用IOC容器中的bean
-
-
AOP
-
基于Java反射,代码模式。
-
可以对类、方法进增强代理,可作用在controller、service、mapper层。
-
有各种丰富的通知,处理复杂逻辑时比较方便。
-
灵活程度高于拦截器。
-
仅对IOC中的bean起作用。
-
总结:
三者功能类似,各有优点。从 过滤器 -> 拦截器 -> AOP,增强的规则更加细致,使用灵活程度高。
执行顺序是 过滤器 -> 拦截器 -> AOP
过滤器主要是过滤使用,对Java web中的各request、response进行过滤和封装,然后再进入到业务代码中。