過(guò)濾器(Filter)
自定義Filter需要實(shí)現(xiàn)了javax.servlet的Filter接口劲蜻。
可以直接在類上加@Component注解 //所有的Url都會(huì)過(guò)過(guò)濾器
或者在配置類(@Configuration注解標(biāo)注的類)中加
@Bean
FilterRegistrationBean registrationBean= new FilterRegistrationBean (){
MyFilter myFilter = new MyFilter();
List<String> url = new ArrayLister<>();
urls.add("/*"); //對(duì)哪些路徑起作用
registrationBean.setUrlPatterns(urls);
return registrationBean;
}
在doFilter處理方法中只能拿到request response。 但是不知道是具體哪個(gè)接口來(lái)處理對(duì)應(yīng)的請(qǐng)求
攔截器(Interceptor)
自定義攔截器需要實(shí)現(xiàn)HandlerInterceptor接口渔隶。
接口中自定義實(shí)現(xiàn)的三種方法:preHandle()、postHandle()、afterCompletion()官套。
preHandle()、postHandle() 像是Filter中doFilter()分開了蚁孔。
不管拋錯(cuò)沒(méi)有都會(huì)進(jìn)到afterCompletion方法
攔截器會(huì)攔截所有的控制器包括spring里自帶的奶赔。
需要在類上加@Component注解并且需要在配置類中聲明。
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
private TimeInterceptor timeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(timeInterceptor);
}
}
攔截器沒(méi)法拿到真正參數(shù)的值
切片(Aspect)
原理是Sping 的aop
自定義切片需要在類上加@Aspect 和 @Component注解
需要我們聲明切入點(diǎn)(說(shuō)明哪些方法 什么時(shí)候切片起作用)
//@Before是在所攔截方法執(zhí)行之前執(zhí)行一段邏輯
//@After是在所攔截方法執(zhí)行之后執(zhí)行一段邏輯杠氢。
//@Around是可以同時(shí)在所攔截方法的前后執(zhí)行一段邏輯
@Aspect
@Component
public class TimeAspect {
Logger logger = LoggerFactory.getLogger(getClass());
//Controller 中的方法
@Around("execution(* com.zlf.mysprin.rest.TestEndpoints.*(..))")
public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) {
logger.info("aspect");
Object result = null;
try {
Object[] args = proceedingJoinPoint.getArgs();
for (Object o : args) {
logger.info("method arg:{}", o);
}
Long start = new Date().getTime();
result = proceedingJoinPoint.proceed();
logger.info("aspect use time:{}", new Date().getTime() - start);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return result;
}
}
切片可以拿到請(qǐng)求方法的傳入?yún)?shù)值站刑,拿不到原始的HTTP請(qǐng)求和響應(yīng)的對(duì)象。
攔截起作用的順序:Filter Interceptor ControllerAdvice Aspect Controller
獲取異常的順序相反