文章内容
一、概念
- 过滤器(Filter)是Java Web的组件之一,其他组件还有Servlet和Listener等,基于回调机制,可以对请求进行预处理和请求后处理,既可以对请求进行拦截,也可以对响应进行处理。
- 拦截器(Interceptor)基于反射机制,可以在请求进到controller前进行拦截,只对controller有效。
- 切面(Aspect)是通知和切点的结合。通知和切点共同定义了切面的全部内容,可以在切点进行前置通知、后置通知、环绕处理、异常执行。
二、触发时机
通过图片可以看到Filter过滤器在容器和Servlet之间触发,Intecepter拦截器在Servlet和Controller之间触发,切面作用于方法,切面在方法执行前、后、环绕、异常执行。
三、作用范围
- 过滤器几乎对所有请求有效,包括css、js等资源文件
- 拦截器只对action(controller)有效
- 切面对所有的方法起作用
四、执行和异常顺序
- 执行顺序:过滤器、拦截器、切面
- 异常顺序:切面、拦截器、过滤器
五、实现方式
- 过滤器:Filter接口
- 拦截器:WebMvcConfigurerAdapter,HandlerInterceptor
- 切面:@Pointcut,@Around,@Before,@After,@AfterReturning,@AfterThrowing
六、获取参数
过滤器和拦截器都可以读取HttpRequest的流,切面可通过切点直接获取。
- 过滤器(Filter):可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
- 拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
- 切面(Aspect):可以拿到方法的参数,但是却拿不到http请求和响应的对象。
七、使用场景
1、过滤器
JavaDoc中的使用场景如下:
- 1)用户访问权限过滤
- 2)日志过滤,可以记录特殊用户的特殊请求的记录等
- 3)图像转换
- 4)数据压缩
- 5)加密
- 6)Token校验
- 7)媒体类型过滤
2、拦截器
- 1)登录验证,判断用户是否登录。
- 2)权限验证,判断用户是否有权限访问资源,如校验token
- 3)日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
- 4)处理cookie、本地化、国际化、主题等。
- 5)性能监控,监控请求处理时长等。
- 6)通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)
3、切面
- 1)日志打印
- 2)性能监控
- 3)针对某些方法实现定制业务