整合各位知乎大神的回答,梳理下思维;
1. 拦截器是aop的实现 ; 这句话就可以说明,拦截器可以实现的,aop均可以实现, 但优势在于拦截器是专门封装的, 可以免去在一起封装,拿来即用;
先说说aop,注解方式的
@Before @After @AfterReturning @AfterThrowing @Around
使你在时机上有更多的选择,也更标准.
executionwithin thistargetargs @target @args@within@annotation
Pointcut让你在使用的位置空间上更加自由.
2.HandlerInterceptor和servlet的Filter比较相似,是一个链式的处理模式,每个请求都会在这个链下跑一遍,实际上很多请求我们是不想去处理的,如果在方法里判断显得很不spring.
而自己用AOP实现,一切皆可配置,不需要的方法不去拦截(配合annotation使用)总之: 如果是特别简单的功能又是通用的,每个请求都要去处理的,比如判断token是否失效,失效直接返回401可以使用spring自带的HanlderIntercept, 复杂的,比如缓存,需要高度自定义,高度可配置,高度可插拔,非必要拦截,就自己用AOP倒腾吧
3.个人觉得,有必要用到request和response的时候,一般只在controller层,可以用拦截器。否则aop更好,因为aop通过IDE的提示可以让你更容易的找到aop的实现,而拦截器必须得去翻配置,另外aop在具体实现上面会比拦截器更简单。4.系统全局的异常捕获用AOP,避免将异常栈信息暴露给客户端;
一些接口的预处理,比如根据Header中的token参数查询出对应的User对象,set到request中并向后传递。 对于普通的业务逻辑来说,他们二者基本都是可以互换的。
原文-知乎: https://www.zhihu.com/question/39510340