1,写两个自定义注解,一个作用于方法的,一个作用于字段的
作用于方法的自定义注解代码:

package com.youku.nintendo.annotation;import enums.PermissionPatternEnum;
import enums.PermissionTypeEnum;import java.lang.annotation.*;@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface Permission {PermissionTypeEnum permissionItem();PermissionPatternEnum permissionPattern() default PermissionPatternEnum.ACT_CONGIG_PERMISSION;String parameterName();
}

作用于字段的自定义注解代码:

package com.youku.nintendo.annotation;import java.lang.annotation.*;@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.FIELD})
public @interface PermissionKey {String value();
}

怎么写权限切面呢?如何获取到post请求中RequestBody中对象的一个属性值呢?

package com.youku.nintendo.aspect;import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.taobao.hsf.annotation.Order;
import com.youku.nintendo.annotation.Permission;
import com.youku.nintendo.annotation.PermissionKey;
import com.youku.nintendo.api.base.result.RttResult;
import com.youku.nintendo.common.constant.ActivityCfgType;
import com.youku.nintendo.manager.AclManager;
import com.youku.nintendo.manager.ActivityCfgManager;
import com.youku.nintendo.utils.MathUtil;
import com.youku.nintendo.vo.ActivityCfgVo;
import enums.PermissionTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import javax.servlet.http.HttpServletRequest;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.List;
import java.util.Map;
import java.util.Objects;import static com.youku.nintendo.common.constant.ErrorCode.ERR_ACTIVITY_CONFIG_DATA_ERROR;@Aspect
@Component
@Order(2)
@Slf4j
public class ACLPermission {@Around(value = "@annotation(permission)")public Object aroundHttpPermission(ProceedingJoinPoint thisJoinPoint, Permission permission) throws Throwable{log.info("aroundHttpPermission into: {}", JSON.toJSONString(permission));Object[] args = thisJoinPoint.getArgs();log.info("JoinPoint,args={}", JSON.toJSONString(args));Method method = ((MethodSignature) thisJoinPoint.getSignature()).getMethod();log.info("JoinPoint,method={}", JSON.toJSONString(method));String parameter = getParameter(permission.parameterName(),method.getParameters(),args);log.info("aroundHttpPermission parameter: {}", JSON.toJSONString(parameter));if (parameter==null){return thisJoinPoint.proceed();}return thisJoinPoint.proceed();}public String getParameter(String parameterName, Parameter[] parameters, Object[] args) throws IllegalAccessException, InvocationTargetException {Map<String,Object> keyAndArgMap = Maps.newHashMap();for (int i = 0; i < parameters.length; i++) {PermissionKey permissionKey = parameters[i].getAnnotation(PermissionKey.class);if (Objects.nonNull(permissionKey)){keyAndArgMap.put(permissionKey.value(),args[i]);}}if (parameterName.startsWith("${") && parameterName.endsWith("}")){String realKey = parse(parameterName, keyAndArgMap);if (StringUtils.isNotBlank(realKey)){return realKey;}}else {Object arg = keyAndArgMap.get(parameterName);if (Objects.isNull(arg)){}return String.valueOf(arg);}return null;}/*** 解析 目前只简单解析"."符号* @param key* @param keyAndArgMap* @return* @throws IllegalAccessException*/private String parse(String key, Map<String,Object> keyAndArgMap) throws IllegalAccessException, InvocationTargetException {int index = key.indexOf("${");int lastIndex = key.lastIndexOf("}");String realKey = key.substring(index + 2, lastIndex);String[] split = realKey.split("\\.");Object target = keyAndArgMap.get(split[0]);if (Objects.isNull(target)){//配置有误}for (int i = 1; i <split.length; i++) {Method[] methods = target.getClass().getMethods();boolean find = false;for (Method method : methods) {String name = method.getName();String upperCaseFirst = buildGetMethodName(split[i]);if (name.equals(upperCaseFirst)){method.setAccessible(true);target = method.invoke(target);find = true;}}if (!find){//如果没有匹配到真实值,说明配置有误}}return String.valueOf(target);}private String buildGetMethodName(String str){char upperCase = Character.toUpperCase(str.charAt(0));StringBuilder builder = new StringBuilder(str.length());builder.append("get");builder.append(upperCase);for (int i = 1; i < str.length(); i++) {builder.append(str.charAt(i));}return builder.toString();}}

注意:关于 method.setAccessible(true);
target = method.invoke(target);这两句代码啥意思?
见文章:
https://blog.csdn.net/qq_42292373/article/details/102469975
http://www.wityx.com/post/22598_1_1.html

如何使用这个自定义注解?

@Permission(permissionItem = PermissionTypeEnum.CONFIG, parameterName = "${acfg.activityCfgCode}")**@PostMapping**("activityCfg/update/white/user")public RttResult<Void> updateActivityConfigWhiteUser(@RequestBody @PermissionKey("acfg") ActivityCfgUpdateRequest activityCfgUpdateRequest) {}

那上面是post请求的获取请求参数值的方式,那get请求呢?

get请求就很简单了,使用方式如下:

 @Permission(permissionItem = PermissionTypeEnum.CONFIG, parameterName = "activityCfgCode")@PostMapping("activityCfg/update/version")public RttResult<Void> updateActivityConfigVersion(@RequestParam @PermissionKey("activityCfgCode") String activityCfgCode) {}

这种是请求参数直接就是想要获取的值,
我发现前提是get请求,如果请求参数在request中,此时也能直接在自定义注解中的属性中获取到request中的某一参数值。
示例如下代码中的idParameterName = “act_id”

 @Permission(permissionItem = PermissionItemEnum.ACTIVITY, permissionPattern = PermissionPatternEnum.LINE_PERMISSION, idParameterName = **"act_id"**)@ResponseBody@RequestMapping(value = "/visualOptimization", method = RequestMethod.GET)public ResultDTO visualOptimization(HttpServletRequest request) {Map<String, String[]> parameterMap = new HashMap<String, String[]>(r**equest.getParameterMap());**Set<String> keys = parameterMap.keySet();int size = keys.size();int k = 0;for (String pkey : keys) {k++;String[] b = parameterMap.get(pkey);url += pkey + "=";if (b != null && b.length != 0) {String value = null;try {value = URLEncoder.encode(b[0], "UTF-8");//替换活动id**if ("act_id".equals(pkey)) {**HollywoodActivityDO activityDO = activityService.queryById(Long.parseLong(value));value = activityDO.getActivityId();}} catch (UnsupportedEncodingException e) {e.printStackTrace();}if (k != size) {url += value + "&";} else {url += value;}}}

有属性的自定义注解,如何获取到post请求中RequestBody中对象的一个属性值?相关推荐

  1. java自定义注解及获取注解参数

    以前不知道注解有什么用,现在学到了框架,发现到处都是注解.所以搞明白注解的原理还是很有必要的. 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为 ...

  2. Spring AOP自定义注解并获取注解的参数

    环境 springboot:1.5 Intellij IDEA:2021.1 序言 最近有个需求,要做方法层面的权限控制.以前在公司使用的是spring security,然后使用注解 如下: @Pr ...

  3. 彻底理解js中的原型对象和prototype属性

    prototype(函数的原型属性) prototype 是一个指向该实例所使用的原型对象的[指针] prototype 是几乎所有的函数(除了某些内建函数)的属性 prototype 不是一个实例的 ...

  4. java的BeanUtils.copyProperties会把为数据源对象中数字包装对象为null的值改成0赋值给操作对象的属性

    如果使用java自带BeanUtils.copyProperties,它会把为数据源对象的数字包装对象为null的值改成0赋值给操作对象的属性!!!

  5. java获取注解信息_java 自定义注解,获取注解信息

    1.声明注解 @OneAnnotation package com.wdletu.log.test; import java.lang.annotation.*; /** * Created by z ...

  6. java中全局变量注解_自定义注解,前端获取token值的时候,全局变量返回后端用注解注入,以便以其他业务层使用...

    @Target(ElementType.PARAMETER)//@Target 说明了Annotation所修饰的对象范围,PARAMETER:用于描述参数 @Retention(RetentionP ...

  7. vue中给window对象上添加属性的方法

    web页面通讯方法.window.open打开新页面,父子页面通讯的方法最直接的就是获取对方的window对象进行调用父子各自得属性及方法. 下面是整理的几种通讯得方法仅供参考 第一种 // 第一种方 ...

  8. java和python根据对象某一个属性排序

    最近在学习java,目前看到java如何对一个对象列表进行排序. 我有一个Member类: public Member(String name,Calendar birthday,Sex gender ...

  9. js中常用的对象—String的属性和方法

    今天说一下,js中常用的内置对象--String对象 它有以下几个常用的属性: length prototype 有以下几个常用的方法: parseInt()转换为数字 parseFloat()转换为 ...

最新文章

  1. 实对称矩阵的性质_浅谈矩阵的相似对角化(一)
  2. 如何实践AI深度学习的十大惊艳案例
  3. Apache配置代理服务器的方法(2)
  4. Hspice2008安装步骤
  5. 好程序员web前端分享MVVM框架Vue实现原理
  6. 七、基于比较的排序算法总结
  7. HTML5和CSS3技术出来了 还需要学习CSS2吗?
  8. vue 工作项目中 实现消息列表的 全选,反选,删除功能
  9. 国产APP自动化测试工具AndroidRobot下载地址
  10. 在Linux环境下安装MYSQL
  11. java MD5完整加解密工具类
  12. 矩形波导中TE波和TM波的截止波数截止波长和截止频率
  13. 加来道雄 基因编辑 纳米机器人_潜力巨大:纳米材料结合CRISPR基因编辑,成功改善阿尔茨海默病症状...
  14. android+锁屏录像,快速录像机(锁屏录像)
  15. 【软工作业思考】关于软工的一些概念性理解暨第一次阅读作业
  16. 分布式系统高可用实战之限流器(Go 版本实现)
  17. algorithm java_Java KeyPairGenerator getAlgorithm()用法及代码示例
  18. MES的关键数据模型S95标准介绍
  19. 什么是企业架构师?关于这个角色,你需要知道的一切及其未来发展
  20. 3GPP TS 23501-g51 中英文对照 | 4.3.5 Service Exposure in Interworking Scenarios

热门文章

  1. Ubuntu图形界面下命令行窗口打开快捷键创建
  2. java打字小游戏源码_求JAVA编写打字游戏源代码!
  3. ATTO 700 荧光染料 齐岳
  4. VxWorks中tornado2.2中的编译器支持哪个C语言标准,有哪些标准库?
  5. 国外整理的一套在线渗透测试资源合集[转载]
  6. 新程序语言 Wyvern 将不同Web语言融合在一起
  7. 【中山大学计算机组成原理实验】单周期CPU设计与实现
  8. 编程创业赚钱-教你怎样开发热门配音程序
  9. 图床项目之后台框架设计
  10. 国科大计算机体系结构习题整理