1 建一个日志接口
import java.lang.annotation.*;
/**
* 日志
*/
@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface Ulog {
String value() default "";
}
2 织入
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.longsheng.assessment.shiro.JWTUtil;
import com.longsheng.common.utils.CommonUtils;
import com.longsheng.entity.SysLogInfo;
import com.longsheng.entity.SysUserInfo;
import com.longsheng.service.ISysLogInfoService;
import com.longsheng.service.impl.SysUserInfoServiceImpl;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
/**
* <p>
* 操作日志保存到数据库
* </p>
*
*
* @since 2021-11-15
*/
@Aspect
@Component
public class SysLogAspect {
//自己的service: 我这里是主要是做了两个操作,1 查询是否有该用户,2 存储日志到数据库.这里用的是mybatis plus.
@Autowired
SysUserInfoServiceImpl sysUserInfoService;
@Autowired
ISysLogInfoService iSysLogInfoService;
//定义切点 @Pointcut
//在注解的位置切入代码
@Pointcut("@annotation( com.longsheng.assessment.config.Ulog)")
public void logPoinCut() {
}
//切面 配置通知
@AfterReturning("logPoinCut()")
public void saveSysLog(JoinPoint joinPoint) {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
//保存日志
SysLogInfo sysLog = new SysLogInfo();
//获取用户ip地址//这里的CommonUtils 是自己封装的工具类.获取IP地址的方法 百度一下 有很多
String ipAddr = CommonUtils.getIpAddr(request);
sysLog.setSysLogInfoIp(ipAddr);
//从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//获取切入点所在的方法
Method method = signature.getMethod();
//获取操作
Ulog ulog = method.getAnnotation(Ulog.class);
if (ulog != null) {
String value = ulog.value();
sysLog.setSysLogInfoContent("IP地址: "+ipAddr+" 进行了:' "+value+" '操作 !");//保存获取的操作
}
//获取请求的类名
String className = joinPoint.getTarget().getClass().getName();
//获取请求的方法名
String methodName = method.getName();
sysLog.setSysLogInfoMethod(className + "." + methodName);
//请求的参数
Object[] args = joinPoint.getArgs();
//将参数所在的数组转换成json
String params = JSON.toJSONString(args);
sysLog.setSysLogInfoParams(params);
sysLog.setSysLogInfoTime(new Date());
//获取用户名
String token = request.getHeader("token");
if(token!=null){
String username = JWTUtil.getUsername(token);
/* String username ="admin";*/
LambdaQueryWrapper<SysUserInfo> queryWrapper = Wrappers.<SysUserInfo>query().lambda()
.eq(SysUserInfo::getUserInfoName, username)
.select(SysUserInfo::getUserInfoId);
SysUserInfo sysUserInfo = sysUserInfoService.getOne(queryWrapper, false);
sysLog.setSysUserId(sysUserInfo.getUserInfoId());
}
//保存操作日志到数据库
iSysLogInfoService.save(sysLog);
}
}
3 pom文件添加:
<!--添加aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
4 controller方法上使用注解
@GetMapping("test")
@Ulog("搞个测试")
public String test(){
return "ok";
}
5 在配置文件中加上
spring:
aop:
auto: true