系好安全再带发车
下面是我在工作中遇到的一个报表导出功能中的其中一个报表设置接口,这个接口我要做权限校验,所以做了前置增强/通知。通过这个接口跟大家介绍SpringAOP各个概念
切面
切面:被@Aspect标记 放增强逻辑的类
// 切面
@Aspect
@Component
public class PermissionAspect {
// 切点
@Pointcut("@annotation(com.baijia.gaotu.mojito.inf.annotation.PermissionTag)")
private void validate() {
}
// 通知
@Before("validate()&&@annotation(permissionTag)")
public void validatePermission(JoinPoint joinPoint, PermissionTag permissionTag) {
}
}
连接点
程序执行过程中的一个时间点,如方法的执行或异常的处理,简单理解为被CPU执行的某一坨业务代码,被切面切的代码,需要被增强的代码
@PostMapping("/set")
@ApiOperation("报表设置")// 这是swagger的注解 标志这个接口是干啥的
@PermissionTag(tag = "总监权限")// 配合切入点(pointcut)使用
public RestResponse<Void> set(@RequestBody @Valid ReportSetDTO reportSetDTO) {
return service.doSomething();// 调用service层
}
通知/建议
增强逻辑 扩展逻辑的一坨代码
@Before("validate()&&@annotation(permissionTag)")// AspectJ表达式 声明这一坨增强逻辑在连接点业务代码执行之前执行
public void validatePermission(JoinPoint joinPoint, PermissionTag permissionTag) {
// 在这里写校验逻辑
if(!用户权限列表.contains("总监权限")){
throw new Exception("不是总监不能进来哦");
}
}
切点
表明我的切面想搞的目标是谁,我的切面要切谁
@Pointcut("@annotation(PermissionTag)")// 我要切被@PermissionTag注解标记的代码
private void validate() {
// 空方法
}