第一步定义一个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);
}