SpringBoot三大利器:过滤器、拦截器、切面

SpringBoot三大利器:过滤器、拦截器、切面插图

一、概念

  • 过滤器(Filter)是Java Web的组件之一,其他组件还有Servlet和Listener等,基于回调机制,可以对请求进行预处理和请求后处理,既可以对请求进行拦截,也可以对响应进行处理。
  • 拦截器(Interceptor)基于反射机制,可以在请求进到controller前进行拦截,只对controller有效。
  • 切面(Aspect)是通知和切点的结合。通知和切点共同定义了切面的全部内容,可以在切点进行前置通知、后置通知、环绕处理、异常执行。

二、触发时机

SpringBoot三大利器:过滤器、拦截器、切面插图2

通过图片可以看到Filter过滤器在容器和Servlet之间触发,Intecepter拦截器在Servlet和Controller之间触发,切面作用于方法,切面在方法执行前、后、环绕、异常执行。

三、作用范围

  • 过滤器几乎对所有请求有效,包括css、js等资源文件
  • 拦截器只对action(controller)有效
  • 切面对所有的方法起作用

四、执行和异常顺序

SpringBoot三大利器:过滤器、拦截器、切面插图4
  • 执行顺序:过滤器、拦截器、切面
  • 异常顺序:切面、拦截器、过滤器

五、实现方式

  • 过滤器: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)针对某些方法实现定制业务
SpringBoot三大利器:过滤器、拦截器、切面插图6

发表评论