过滤器、拦截器、切面区别

1、执行顺序:过滤器 -> 拦截器 -> 切面
2、过滤器和拦截器都是请求层面的拦截,切面是方法层面的拦截
3、拦截器只在请求进入controller前执行,过滤器会在进入controller与执行后执行,切面可通过配置在方法执行前、后、环绕、异常执行
4、获取参数方式:过滤器和拦截器都需要读取HttpRequest的流,切面可通过切点直接获取

使用场景

认证、授权校验:拦截器
	只需在进入请求前判断是否认证及是否有权限

某些异常不影响上下文逻辑:切面(环绕增强)
	redis宕机、解析失败等,导致redis不可用,但通过环绕切面可以捕获异常并继续执行逻辑

接口请求时间记录:切面(环绕增强)
	在请求前后记录当前时间,并计算出请求时间并记录(还可以记录一些异常情况)

过滤器:目前没有使用到,但一些请求前请求后都需要处理的场景可以使用

重复请求实现选择

这里我最终选择切面,没选择拦截器
首先获取参数切面会比拦截器简单多
其次切面是方法层面的拦截,拦截器是请求层面的,而在我们项目中,目前只需要对2个地方做重复请求校验,并不是所有接口都需要(而且用拦截器,还要过滤掉查询接口,就很麻烦),所以通过切面的方式指定切点即可(类似贴@Transational注解)


小结

对于大部分请求都需要处理的逻辑,例如登录、权限校验,就用拦截器
对于部分/某一类方法,需要做增强,例如redis宕机、重复请求校验,就用切面
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐