SpringBoot 封装一个自定义拦截器(interceptor)注解(annotation)

文章探讨了在开发项目时遇到的每个子项目都需要单独配置拦截器的问题,提出了通过自定义注解来为特定路由接口指定拦截器的解决方案。作者创建了一个自定义注解`@CustomInterceptors`,并在拦截器配置类中检查该注解以执行对应的拦截器。若需在多个子项目中使用,需注意避免冲突并可能利用SpringBoot的条件注解进行自动配置。
摘要由CSDN通过智能技术生成

问题的产生:在开发项目使用拦截器的时候,发现每个子项目都需要配置拦截器,而且许多路由接口都需要配置不同的拦截器,每次都需要重新找到拦截器配置文件去注册一个新的拦截器,非常的麻烦,就想,能不能有个注解可以给特定的路由接口配置特定的拦截器。

问题调查:

        1. 经调查,有许多人都多 @RequestMapping 注解可以使用 interceptor 属性来指定特定的拦截器,但是我发现并不行,而且没有该参数,源码如下。感兴趣的人可以自己调查。

 注解开发

        1. 首先自定义一个注解类

public @interface CustomInterceptors {
    String[] value();
}

         2.在拦截器配置类中注册一个拦截器,然后检查该路由接口上是否有自定义的注解 @CustomInterceptors。如果有,执行该拦截器

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                if (handler instanceof HandlerMethod) {
                    HandlerMethod handlerMethod = (HandlerMethod) handler;
                    Interceptors methodInterceptors = handlerMethod.getMethod().getAnnotation(Interceptors.class);

                    // Handle method-level interceptors
                    if (methodInterceptors != null) {
                        for (String interceptorName : methodInterceptors.value()) {
                            HandlerInterceptor interceptor = (HandlerInterceptor) applicationContext.getBean(interceptorName);
                            boolean shouldContinue = interceptor.preHandle(request, response, handler);
                            if (!shouldContinue) {
                                return false;
                            }
                        }
                    }
                }
                return true;
            }
        });
    }

        3. 如果需要抽取成为一个公用的子项目,然后分别导入到各个子项目中,那么需要将该配置类导入到对应子项目

@SpringBootApplication
@ComponentScan(basePackages = {"com.demo.*", "com.custom.interceptor.*"})
@Import(InterceptorConfiguration.class)
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

注:该方法有一种问题,请注意,如果子项目中有单独的拦截器需要注册,那么一定要注意不要残生冲突。

要解决这个问题,可以使用SpringBoot的条件注解,自动配置,欢迎留言讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>