利用自定义注解记录用户操作日志一次实现

133 阅读1分钟

第一步定义一个UserLog注解

@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserLog
{
    // 模块
    public String title() default "";
     //操作类型OperaterType是个枚举标识操作,值为增删改查导入
    public OperaterType OperaterType() default OperaterType.OTHER;
     // 操作人类别,管理员还是普通用户
    public OperatorType operatorType() default OperatorType.MANAGE;
     //是否保存请求的参数
    public boolean isSaveRequestData() default true;
}

第二步 定义切入点

@Pointcut("@annotation(..UserLog)")   //这里定义为UserLog注解
    public void logPointCut()
    {
    }

第三步 定义一个方法来处理接口日志

joinPoint 切点对象 参数 e方法出现异常 参数jsonResult 方法的返回值

protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult)
{
       //1 获取方法的注解
       
UserLog controllerLog=((MethodSignature)(joinPoint.getSignature())).getMethod().getAnnotation(UserLog.class);
if (controllerLog == null)
{
    return;
}
//2 下面记录日志,代码略 只说流程
//实例化一个日志model
//给model赋值 ip user controllerLog的值,路径、返回值等信息
//保存到数据库
//将以上代码try catch


}

第四步 定义通知

定义两个通知 AfterReturning在方法返回后和AfterThrowing方法异常后执行记录日志

/**
 * 处理完请求后执行
 *
 * @param joinPoint 切点
 */
@AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
public void doAfterReturning(JoinPoint joinPoint, Object jsonResult)
{
    handleLog(joinPoint, null, jsonResult);
}

/**
 * 拦截异常操作
 * 
 * @param joinPoint 切点
 * @param e 异常
 */
@AfterThrowing(value = "logPointCut()", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Exception e)
{
    handleLog(joinPoint, e, null);
}