• 自定义注解及其理解


    示例:

    @Documented //说明该注解将被包含在javadoc中
    @Inherited //说明子类可以继承父类中的该注解
    @Target({ElementType.METHOD}) //作用于方法、不能是构造方法
    @Retention(RetentionPolicy.RUNTIME) // 在运行时可以通过反射获取到,JVM会读取注解,同时保存在class文件中
    public @interface ResourceValidate {

       /**
        * 资源编号数组{"01000000", "02000000"}
        */
       String[] resourcesNos();
    }
    使用:

    @Aspect
    @Component
    @Order(1)
    public class ResourceValidateAspect {

       @Pointcut("execution (* com.kexin.finance.register.system.rest..*.*(..))")
       public void restAspect() {

      }

       //   @Around("restAspect()")   // TODO: 2018/8/23 放开权限/关闭权限
       public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
           /** 目标接口 */
           MethodSignature signature = (MethodSignature) joinPoint.getSignature();
           /** 目标方法 */
           Method method = signature.getMethod();
           /** 权限验证注解 */
           ResourceValidate resourceValidate = method.getAnnotation(ResourceValidate.class);//表示得到目标接口方法的某个注解的的信息
           if (resourceValidate == null) {
               /** 不需要权限验证 */
               return joinPoint.proceed();
          }
           HttpServletRequest request = this.getHttpServletRequest();
           HttpServletResponse response = this.getHttpServletResponse();
           String[] resourcesNos = resourceValidate.resourcesNos();
           if (resourcesNos.length <= 0) {
               request.setAttribute(ForwardUrlConstant.UN_AUTHORITY_REQUEST_URL, request.getRequestURL());
               /** 未配置可用资源编号 拦截请求 返回无权限信息 */
               request.getRequestDispatcher(ForwardUrlConstant.UN_AUTHORITY).forward(request, response);
               return null;
          }
           List<String> resourcesNoList = UserTokenUtil.getResourcesNoList();
           if (resourcesNoList == null || resourcesNoList.isEmpty()) {
               /** 无资源编号权限集合 请求拦截 返回无权限信息 */
               // 将请求 url 设置到 request 中,以便在接口方法中获取,放在返回到前端的提示信息中
               request.setAttribute(ForwardUrlConstant.UN_AUTHORITY_REQUEST_URL, request.getRequestURL());
               // 请求转发到“无权限”(/unAuthority)接口
               request.getRequestDispatcher(ForwardUrlConstant.UN_AUTHORITY).forward(request, response);
               return null;
          }
           /** 比对接口需要权限和用户具有的权限 */
           for (String resourceNo : resourcesNos) {
               if (resourcesNoList.contains(resourceNo)) {
                   /** 具有接口权限 通过 */
                   return joinPoint.proceed();
              }
          }
           /** 对比结束 无权限 */
           request.setAttribute(ForwardUrlConstant.UN_AUTHORITY_REQUEST_URL, request.getRequestURL());
           request.getRequestDispatcher(ForwardUrlConstant.UN_AUTHORITY).forward(request, response);
           return null;
      }

       private HttpServletRequest getHttpServletRequest() {
           return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
      }

       private HttpServletResponse getHttpServletResponse() {
           return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
      }

    }
     

    @GetMapping(value = "/pageData")
       @ApiOperation(value = "登记信息分页查询数据", notes = "登记信息分页查询数据")
       @ResourceValidate(resourcesNos = "0201010000")
       public ResultResponse pageData(@ModelAttribute RegisterInfoVO query, @ModelAttribute PageData pageData) {
           // 登记信息分页查询数据
           pageData.setTotalRecords(registerInfoService.findRegisterInfoPageCount(query));
           pageData.setQuery(query);
           pageData.setData(registerInfoService.findRegisterInfoPageData(pageData));
           return ResultResponse.successDataHiddenMsg(pageData);
      }
    其中

            /** 权限验证注解 */

            ResourceValidate resourceValidate = method.getAnnotation(ResourceValidate.class);

    是定义的自定义注解的实例,其从接口方法中获取到所需要的权限代码对象:

            @ResourceValidate(resourcesNos = "0201010000")

    然后得到对象的属性:即接口所拥有的所有的资源编码的数组:

            String[] resourcesNos = resourceValidate.resourcesNos();

    然后就可以验证用户的权限是否正确了。

  • 相关阅读:
    HTML CSS 特殊字符表
    vscode代码统计——Vscode counter
    js数组方法整理
    CSS-界面滚动时不显示滚动条
    Vue Loader 作用域CSS(scoped)——/deep/ 深入组件选择器
    PHP模板引擎,Smarty定义
    mysql触发器trigger 实例详解
    mysql关于数据库表的水平拆分和垂直拆分
    关于数据库表的水平拆分和垂直拆分
    使用Merge存储引擎实现MySQL分表
  • 原文地址:https://www.cnblogs.com/zhishuiyushi/p/9855212.html
Copyright © 2020-2023  润新知