一、创建注解
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 = "登录查询") | 留言与评论(共有 0 条评论) “” |