1 框架自带拦截器
框架中目前拥有三个自定义拦截器,分别指定了其执行的顺序。如果添加了sentinel,在会再添加一个sentinel的拦截器,其order最小,也就是最先执行。
2 自定义拦截器
通常情况下,框架自带的拦截器能满足需要,但是对于一些特殊场景,可能需要自定义拦截器。
自定义拦截器推荐如下:
2.1定义拦截器
@Slf4j
public class XxxHandlerInterceptor extends HandlerInterceptorAdapter {
private XxxConfig xxxConfig;
public HeaderHandlerInterceptor(XxxConfig xxxConfig) {
super();
this.XxxConfig = XxxConfig;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// TODO
// throw new BizException(code,message);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
对于拦截器中的校验,推荐使用抛异常的方式处理。
2.2 在InterceptorConfig声明拦截器Bean
/**
* <p>自定义拦截器配置</p >
*
* @author iu
* @version 1.0
* @date 2020/06/22 21:19
*/
@Configuration
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public XxxHandlerInterceptor xxxHandlerInterceptor(){
return new XxxHandlerInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//根据需要,通过调整order来调整拦截器的执行顺序
// 通过debug,可以看到每个拦截器的order
registry.addInterceptor(xxxHandlerInterceptor()).order(100);
}
}
为什么不用new的方式直接添加?
因为new 脱离了spring的aop,没有办法动态代理,这样就拦截器中便不能注入spring容器中的bean了。
声明bean,就是为了让spring容器托管。
�