aop实现记录日志

#头条创作挑战赛#

一、创建注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EventCollectAn {

    public String comment() default "";

}

二、收集日志对应的实体

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;

public class SysLog extends Model {

	private static final long serialVersionUID=1L;

    @TableId(value = "log_id", type = IdType.UUID)
    private String logId;

    private String userId;

    private String nickName;

    /**
     * 访问接口
     */
    private String provider;

    /**
     * 事项内容
     */
    private String eventContent;

    /**
     * 记录时间
     */
    private String inputTime;

    public SysLog(String userId, String nickName, String provider, String eventContent, String inputTime) {
        this.userId = userId;
        this.nickName = nickName;
        this.provider = provider;
        this.eventContent = eventContent;
        this.inputTime = inputTime;
    }

    public String getLogId() {
        return logId;
    }

    public void setLogId(String logId) {
        this.logId = logId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getProvider() {
        return provider;
    }

    public void setProvider(String provider) {
        this.provider = provider;
    }

    public String getEventContent() {
        return eventContent;
    }

    public void setEventContent(String eventContent) {
        this.eventContent = eventContent;
    }

    public String getInputTime() {
        return inputTime;
    }

    public void setInputTime(String inputTime) {
        this.inputTime = inputTime;
    }

    @Override
    protected Serializable pkVal() {
        return this.logId;
    }

    @Override
    public String toString() {
        return "SysLog{" +
        "logId=" + logId +
        ", userId=" + userId +
        ", provider=" + provider +
        ", eventContent=" + eventContent +
        ", inputTime=" + inputTime +
        "}";
    }
}

三、定义切面

import cn.hutool.core.date.DateUtil;
import com.xxx.xxx.core.annotation.EventCollectAn;
import com.xxx.xx.core.shiro.manager.ShiroSessionManager;
import com.xxx.xxx.entity.system.SysLog;
import com.xx.xx.entity.system.SysUser;
import com.xx.xx.service.system.SysLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import java.lang.reflect.Method;
import java.util.Date;

/**
 * 事件收集器
 */
@Component
@Aspect
public final class EventCollectAspect {
	
   @Autowired
   private SysLogService sysLogService;

   @Pointcut("@annotation(com.xxx.xxx.core.annotation.EventCollectAn)")
   public void annotationPointcut() {
   }

   @Before("annotationPointcut()")
   public void beforePointcut(JoinPoint joinPoint) {
   }

   @Around("annotationPointcut()")
   public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
      return joinPoint.proceed();
   }

   /**
    * 在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
    * @param joinPoint
    */
   @AfterReturning("annotationPointcut()")
   public void doAfterReturning(JoinPoint joinPoint) {
      //获取当前登录用户 根据自己系统获取对应的用户,此时我用户的shiro
      SysUser user = ShiroSessionManager.getUser();
      //获取签署名
      MethodSignature signature = (MethodSignature) joinPoint.getSignature();
      //获取织入的方法
      Method method = signature.getMethod();
      //获取方法上的注解
      //日志收集器
      EventCollectAn eventCollectAn = method.getAnnotation(EventCollectAn.class);
      //访问接口
      RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
      String[] providers = requestMapping.value();
      String provider = providers.length>0 ? providers[0] : "";
      String inputTime = DateUtil.now();
      if(eventCollectAn != null) {
         String comment = eventCollectAn.comment();
         if(null == comment || "".equals(comment)){
            String name = method.getName();
            if("topage".equals(name)){
               Object[] args = joinPoint.getArgs();
               provider += "?page=" + args[0];
               comment = (String) args[1];
            }
         }
        //获取到相关的信息进行日志的记录
         SysLog sysLog = new SysLog(user.getUserId(), user.getNickName(), provider, comment, inputTime);
         sysLogService.save(sysLog);
      }
   }
}

四、在对应的方法上写上注解

@EventCollectAn(comment = "登录查询")
日志   aop
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章