AOP:
- 对目标对象当中的原始方法进行功能的增强
1、引入依赖
<!--AOP起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、准备实体类与数据库
3、自定义注解
- 确定注解生效的时间与位置
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
}
4、定义切面类,完成记录操作日志的逻辑
-
获取当前登录用户:
获取request对象,从请求头中获取到jwt令牌,解析令牌获取出当前用户的id。
@Slf4j
@Aspect//切面类
@Component
public class MyAspect01 {
@Autowired
private HttpServletRequest request;
@Autowired
private OperateLogMapper operateLogMapper;
@Around("@annotation(com.itheima.anno.Log)")
public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable {
//1、操作人ID--当前员工d登录ID
//2、获取请求头中的JWT令牌,解析令牌
String jwt = request.getHeader("token");
Claims claims = JwtUtils.parseJWT(jwt);
Integer operateUser= (Integer) claims.get("id");
//3、操作时间
LocalDateTime operateTime = LocalDateTime.now();
//操作类名
String className = joinPoint.getTarget().getClass().getName();
//操作方法名
String mothedName = joinPoint.getSignature().getName();
//操作方法参数
Object[] args = joinPoint.getArgs();
String methodParams = Arrays.toString(args);
long begin = System.currentTimeMillis();
//一、调用原始目标方法运行
Object result = joinPoint.proceed();
long end = System.currentTimeMillis();
//操作方法返回值
String returnValue = JSONObject.toJSONString(result);
//操作耗时:原始执行方法之前记录开始时间,执行方法之后记录结束时间
Long costTime= end- begin;
//二、记录操作日志
OperateLog operateLog =new OperateLog(null,operateUser,operateTime,className,mothedName,methodParams,returnValue,costTime) ;
operateLogMapper.insert(operateLog);
log.info("AOP记录操作日志:{}",operateLog);
return result;
}
}