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小时内删除。
发表评论