zoukankan      html  css  js  c++  java
  • 自定义注解,反射注解

    目的:项目接口的权限设置(springBoot)

    在Controller的类上和方法上打注解(项目运行时,使用反射获取注解的值),然后将方法的访问权限放入数据库表,用户发起请求时,在拦截器里面查询数据库验证是否有权限

    代码

    定义两个注解

    /**
     * 定义一个用于类上的注解,并且可以使用反射获取
     */
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ClassAnnotation {
        //类名称,或类描述
        String className();
    }
    /**
     * 定义一个用于方法上的注解,并且可以使用反射获取
     */
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MethodAnnotation {
        //方法名称,或方法描述
        String methodName() default "";
        //是否有权限0:有限制的访问权限,1:登录即可访问
        int type() default 0;
    }

    在Controller上使用注解

    @ClassAnnotation(className="控制器类")
    public class TestController {
        @MethodAnnotation(methodName = "方法描述:登录就能访问",type = 1)
        public void test001(){
            
        }
        @MethodAnnotation(methodName = "方法描述:有限制的访问权限",type = 0)
        public void test002(){
    
        }
    }

    main方法中测试(这里的for里面会空指针异常,是因为,一个类还有Object类的一些方法,这些方法没有注解所以抛异常,自己处理)

    public static void main(String[] args) {
            //获取控制器类的Class对象
            Class<TestController> c = TestController.class;
            //获取控制器类上的注解
            ClassAnnotation annotation = c.getAnnotation(ClassAnnotation.class);
            System.out.println("类的描述为:" + annotation.className());
            //获取控制器类的所有方法
            Method[] methods = c.getMethods();
            for (Method m : methods) {
                //获取某个方法上的注解
                MethodAnnotation methodAnnotation = m.getAnnotation(MethodAnnotation.class);
                System.out.println("方法..."+m.getName()+"::"+methodAnnotation.methodName()+methodAnnotation.type());
            }
        }

     在项目中使用

    /**
    * 权限构造器,项目启动的时候加载
    */
    @Component
    public class SpringControllerPermissionBuilder implements ApplicationContextAware {
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         // RequestMappingHandlerMapping requestMappingHandlerMapping
    = applicationContext.getBean(RequestMappingHandlerMapping.class); // 获取url与类和方法的对应信息 Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();for (Map.Entry<RequestMappingInfo, HandlerMethod> m : map.entrySet()) { HandlerMethod method = m.getValue(); RequestMappingInfo info = m.getKey();
           //获取类上注解 ClassAnnotation permissionGroup
    = method.getMethod().getDeclaringClass().getAnnotation(ClassAnotation.class);
           //获取方法上的注解 MethodAnnotation permissionItem
    = method.getMethod().getAnnotation(MethodAnnotation.class);
           //获取类的所有方法的访问路径(即接口访问路径)
           Set<String> stringSet = info.getPatternsCondition().getPatterns();
          //写入数据库.....
    }
    从ApplicationContextAware获取ApplicationContext上下文的情况,仅仅适用于当前运行的代码和已启动的Spring代码处于同一个Spring上下文,否则获取到的ApplicationContext是空的。


    作者:不知名的蛋挞
    链接:https://www.jianshu.com/p/4c0723615a52
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    概念

    元注解(为其他注解做注解)

  • 相关阅读:
    mvc 当中 [ValidateAntiForgeryToken] 的作用 转载https://www.cnblogs.com/hechunming/p/4647646.html
    ASP.NET MVC学习系列(一)-WebAPI初探
    ASP.NET MVC学习系列(二)-WebAPI请求 转载https://www.cnblogs.com/babycool/p/3922738.html
    MVC和WebApi 使用get和post 传递参数。 转载https://blog.csdn.net/qq373591361/article/details/51508806
    Web API与AJAX:理解FormBody和 FormUri的WebAPI中的属性
    webApi之FromUri和FromBody区别
    C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解 转载 https://www.cnblogs.com/landeanfen/p/5501487.html
    JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查
    PHP 生成唯一的激活码
    C++ virtual继承
  • 原文地址:https://www.cnblogs.com/javalbb/p/12746452.html
Copyright © 2011-2022 走看看