springboot 通过注解的形式集成aop 切⾯实现签名认证(token 验证,权限认证)
内。。。
说明 **本⽂是通过springboot注解的⽅式集成切⾯,让验证模块可以在项⽬中更灵活的配置。**注解的⽅式集成aop切⾯在实际使⽤中只需要将注解标注在需要执⾏aop逻辑的⽅法上即可实现调⽤。使⽤起来⽅便快捷,原始配置aop切⾯⼀般都会标注为某个package包下⽅的所
有类中的⽅法,⽽实际业务中可能并不是这样的,注解的⽅式就是为了应对这种情况,能更灵活的控制aop切⾯。
通过注解实现aop 切⾯
使⽤到的jar 包
配置注解
@Target ⽤来标注注解可以被⽤在哪些地⽅,该注解中的参数是可以放多个,我们是⽤他来进⾏签名验证,只使⽤到了⽅法,当然也可以加个ElementType.TYPE  可以将注解放在类上,标注当前类中的所有⽅法都会执⾏(但是测试过程中直接标注在类上并不会触发下⾯的⽅法都执⾏aop处理逻辑)。所以aop集成注解的形式应该只⽀持注解标注⽅法上。
@Retention 该注解是标注的⽣命周期,定义的注解那⼀般情况下肯定是运⾏时⼀直⽤的,所以⼀般都会选择RUNTIME。
1、RetentionPolicy.SOURCE:注解只保留在源⽂件,当Java⽂件编译成class⽂件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class⽂件,但jvm加载class⽂件时候被遗弃,这是默认的⽣命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class⽂件中,jvm加载class⽂件之后,仍然存在;
@Documented 指明修饰的注解,可以被例如javadoc此类的⼯具⽂档化,只负责标记,没有成员取值。
想深⼊了解可以移步<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-aop</artifactId>        </dependency>
1
2
3
4
5
6
7
89@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented public @interface TokenVerify {    String value() default "";}
1
2
3
4
5
6
7
8
配置切⾯类,切⼊配置好的注解
验证@Aspect
@Component
@Slf4j
public class TokenAspect {
@Pointcut("@annotation(fig.TokenVerify)")
public void tokenAspect() {
}
@Around("tokenAspect()")
public Object beforePointcut(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("  切⾯类  ---!");
try{
/
/获取RequestAttributes
RequestAttributes requestAttributes = RequestAttributes();
//从获取RequestAttributes中获取HttpServletRequest的信息
HttpServletRequest request = (HttpServletRequest) solveReference(RequestAttributes.REFERENCE_REQUEST);            String data = Header("Authorization");
if (ObjectUtils.isEmpty(data)){
JSONString("token - null");
}
//业务逻辑通过token查询验证
//-------
//验证完成后调⽤触发aop前置的⽅法并返回处理完成的结果
Object result = joinPoint.proceed();
return result;
}catch (Exception e){
e.printStackTrace();
JSONString("签名不合法");
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
注解扩展
/
/当然部分业务逻辑可能涉及到每个注解所对应到⽅法有其他附加值,每个⽅法有不相同 例如 我们现在需要通过aop加⼊系统操作⽇志,每个⽅法操作的信息不⼀样,有新增有修改,这样的话我们可以使⽤注解的value标注,
怎么取呢
//切⾯类中加⼊@RestController @RequestMapping(value ="/test/aop/verify")public class TestController {    @TokenVerify    @RequestMapping("/methodOne")    public String methodOne(){        System.out.println("新增⽤户  ----- ");        return "新增成功";    }    @RequestMapping("/methodTwo")    public String methodTwo(){        System.out.println("删除⽤户  ----- ");        return "删除成功";    }}12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1819@RestController @TokenVerify @RequestMapping(value ="/testtwo/aop/verify")public class TestTwoController {    @RequestMapping("/methodOne")    public String methodOne(){        System.out.println("新增⽤户  ----- ");        return "新增成功";    }    @RequestMapping("/methodTwo")    public String methodTwo(){        System.out.println("删除⽤户  ----- ");        return "删除成功";    }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18@TokenVerify("我在methodOne 上")    @RequestMapping("/methodOne")    public String methodOne(){        System.out.println("新增⽤户  ----- ");        return "新增成功";    }
1
2
3
4
5
6
7
//完整代码展⽰
以上,希望本⽂可以帮到你。  MethodSignature signature = (MethodSignature) Signature();            TokenVerify tokenVerify = Method().getDeclaredAnnotation(TokenVerify.class);            String value = tokenVerify.value();            System.out.println("==注解@TokenVerify 的value==" + value);1
2
3
4@Around("tokenAspect()")    public Object beforePointcut(ProceedingJoinPoint joinPoint) throws Throwable {        log.info("  切⾯类  ---!");        try{            MethodSignature signature = (MethodSignature) Signature();            TokenVerify tokenVerify = Method().getDeclaredAnnotation(TokenVerify.class);            String value = tokenVerify.value();            System.out.println("==注解@TokenVerify 的value==" + value);            //获取RequestAttributes            RequestAttributes requestAttributes = RequestAttributes();            //从获取RequestAttributes 中获取HttpServletRequest 的信息            HttpServletRequest request = (HttpServletRequest) solveReference(RequestAttributes.REFERENCE_REQUEST);            String data = Header("Authorization");            if (ObjectUtils.isEmpty(data)){                JSONString("token - null");            }            //业务逻辑通过token 查询验证            //-------            //验证完成后调⽤触发aop 前置的⽅法 并返回处理完成的结果            Object result = joinPoint.proceed();            return result;        }catch (Exception e){            e.printStackTrace();            JSONString("签名不合法");        }    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
springboot aop27
28
29

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。