1 框架自带拦截器

自定义拦截器 - 图1

框架中目前拥有三个自定义拦截器,分别指定了其执行的顺序。如果添加了sentinel,在会再添加一个sentinel的拦截器,其order最小,也就是最先执行。

2 自定义拦截器

通常情况下,框架自带的拦截器能满足需要,但是对于一些特殊场景,可能需要自定义拦截器。

自定义拦截器推荐如下:

2.1定义拦截器

  1. @Slf4j
  2. public class XxxHandlerInterceptor extends HandlerInterceptorAdapter {
  3. private XxxConfig xxxConfig;
  4. public HeaderHandlerInterceptor(XxxConfig xxxConfig) {
  5. super();
  6. this.XxxConfig = XxxConfig;
  7. }
  8. @Override
  9. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  10. // TODO
  11. // throw new BizException(code,message);
  12. return true;
  13. }
  14. @Override
  15. public void afterCompletion(HttpServletRequest request,
  16. HttpServletResponse response,
  17. Object handler, Exception ex) throws Exception {
  18. }

对于拦截器中的校验,推荐使用抛异常的方式处理。

2.2 在InterceptorConfig声明拦截器Bean

  1. /**
  2. * <p>自定义拦截器配置</p >
  3. *
  4. * @author iu
  5. * @version 1.0
  6. * @date 2020/06/22 21:19
  7. */
  8. @Configuration
  9. @RequiredArgsConstructor(onConstructor = @__(@Autowired))
  10. public class InterceptorConfig implements WebMvcConfigurer {
  11. @Bean
  12. public XxxHandlerInterceptor xxxHandlerInterceptor(){
  13. return new XxxHandlerInterceptor();
  14. }
  15. @Override
  16. public void addInterceptors(InterceptorRegistry registry) {
  17. //根据需要,通过调整order来调整拦截器的执行顺序
  18. // 通过debug,可以看到每个拦截器的order
  19. registry.addInterceptor(xxxHandlerInterceptor()).order(100);
  20. }
  21. }

为什么不用new的方式直接添加?

因为new 脱离了spring的aop,没有办法动态代理,这样就拦截器中便不能注入spring容器中的bean了。

声明bean,就是为了让spring容器托管。