拦截器interceptor中获取自定义注解annotation的信息

文章介绍了如何在Java中使用自定义注解,并展示了如何在拦截器中获取类、方法和参数上的注解信息。通过拦截器实现预处理、后处理和完成后的操作,并通过WebMvcConfigurer配置拦截器规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、自定义注解
          

        注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。它相当于一个标记,这个标记我们也可以自己定义,也就有了自定义注解。在这里就不对注解进行详解了。

        自定义注解可作用在有类、接口、方法、属性、参数等,它由定义注解接口上的@Taeget配置决定

@Target({ElementType.METHOD,ElementType.PARAMETER,ElementType.FIELD, ElementType.TYPE})
  
二、拦截器
            拦截器我们只需实现HandlerInterceptor接口并重写它的方法,然后实现WebMvcConfigurer注册拦截器 
如下:
@Component
public class AyanInterceptor implements HandlerInterceptor {

    //该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作。
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        return true;
    }

    //该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    //该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
  
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Autowired
    private AyanInterceptor ayanInterceptor;

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        WebMvcConfigurer.super.configurePathMatch(configurer);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptor = registry.addInterceptor(ayanInterceptor);
        interceptor.addPathPatterns("/**"); //拦截所有路径
        interceptor.excludePathPatterns("/login");//排除拦截/login路径
    }
}

 

三、拦截器中获取注解信息
    首先在拦截器里面我们需要把hander的类型转为HandlerMethod
    
//方法处理器, 请求的目标方法
HandlerMethod handlerMethod = (HandlerMethod) handler;
这里会容易出现一个错误,就是转换失败的问题!!!!!
这个原因一般是年轻人大意导错包了,笔者当时也大意了然后搞了很久才看出来~难搞哦,正确的包是web.method.HandlerMethod
所以建议这里面判断一下是否为HandlerMethod类型,避免程序报错
if (handler instanceof HandlerMethod) { //判断handler是否为HandlerMethod的实例来避免类型转换错误
    //方法处理器, 请求的目标方法
    HandlerMethod handlerMethod = (HandlerMethod) handler;
}

  铁汁们重点来了哦都多余了噢~
  下面就是如何获取注解的信息了,在这里主要展示我们常用在类、方法、参数上的自定义注解:
作用在类:
    我们可以通过 handler 参数获取当前拦截的方法,并进一步获取方法所在的类。然后,我们可以使用反射机制获取类上的注解信息,
判断是否存在我们需要的自定义注解,并进一步获取注解的属性值。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            // 获取拦截的方法
            Method method = handlerMethod.getMethod();
            // 获取方法所在的类
            Class<?> clazz = method.getDeclaringClass();
            // 获取类上的注解
            Annotation[] annotations = clazz.getAnnotations();
            for (Annotation annotation : annotations) {
                if (annotation instanceof AyanAnnotation) {
                    AyanAnnotation ayan = (AyanAnnotation) annotation;
                    // 获取注解的属性值
                    String value =ayan.value();
                    System.out.println("类上的自定义注解信息: " + value);
                }
            }
        }
        return true;
    }
作用在方法:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            // 获取方法上的注解
           AyanAnnotation ayan = handlerMethod.getMethodAnnotation(AyanAnnotation.class);//获取目标方法上的指定注解
            if (ayan!= null){
               // 获取注解的属性值
               String value = ayan.value();
               System.out.println("方法上的自定义注解信息: " + value);
            }
        }
        return true;
    }
作用在参数:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
             MethodParameter[] methodAnnotations = handlerMethod.getMethodParameters(); //获取方法参数
          for (MethodParameter methodParameter : methodAnnotations) {
                 AyanAnnotation ayan = methodParameter.getParameterAnnotation(AyanAnnotation.class); //获取指定参数注解
                 if (ayan!= null){
                      String value = ayan.value();
                      System.out.println("方法上的自定义注解信息: " + value);
                    }
                        }
        }
        return true;
    }
好了以上就是本文的全部内容,这些是在笔者学习工作过程中的一点点总结,希望能对有需要的铁汁提供学习和帮助
笔者ayan也是第一次写这种文章,还有很多不足,但会不断努力滴,多多关注噢铁汁们    都多余了噢,爱谁谁~
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值