项目中使用敏感字段的加解密,但是有的是直接在url中拼接的 ,所以我就想根据一个自定义注解的方式做匹配 ,修改值
利用反射的机制实现值的修改
以下是具体的代码
- 依赖aop
<!-- SpringBoot 拦截器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- aop注解
/**
* @author lkz
* @date 2021/12/13 14:43
* @description 参数方法
*/
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ArgAnnotationMethod {
}
@Documented
@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ArgsAnnotation {
}
- AOP切面
@Aspect
@Component
@Slf4j
public class AopArgsDemo {
@Pointcut("@annotation(com.demo.user.aop.annotation.ArgAnnotationMethod)")
public void pointParam(){
}
@Before("pointParam()")
public static void startArs(JoinPoint joinPoint) throws IllegalAccessException, NoSuchFieldException {
final Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
final String[] names = methodSignature.getParameterNames();//获取参数的名字
final Object[] args = joinPoint.getArgs();// 获取参数的值
String name = joinPoint.getSignature().getName();//获取方法的名字
//获取参数注解 :1维是参数,2维是注解
Annotation[][] annotations = methodSignature.getMethod().getParameterAnnotations();
for(int i=0;i<annotations.length;i++){
Object param=args[i];
Annotation[] paramAn= annotations[i];
//参数为空 直接下一个参数
if(param==null || paramAn.length==0){
continue;
}
for(Annotation annotation:paramAn){
//判断是否包含某个制定的注解
if(annotation.annotationType().equals(ArgsAnnotation.class)){
//效验改参数 验证一次并退出改注解
Field field = String.class.getDeclaredField("value"); //value是固定值 就是这样写
field.setAccessible(true);
field.set(param,field.get("南京"));
break;
}
}
}
System.out.println("AopArgsDemo切面执行获取参数方法:"+name+"方法开始执行,参数是:"+ Arrays.asList(args));
}
- 测试
@RestController
@Slf4j
@RequestMapping("aop")
public class AopTestController {
@GetMapping("test3")
public void testArg(String name){
System.out.println("aop 测试方法路径参数:"+name);
}
@GetMapping("test4")
@ArgAnnotationMethod
public void testArg4(@ArgsAnnotation String name,@ArgsAnnotation String age,String adree){
System.out.println("aop 测试方法路径参数:"+name+"-----年龄"+age+"----地址:"+adree);
}
}