springboot—springaop实现系统操作日志记录存储到数据库
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
springboot—springaop实现系统操作⽇志记录存储到数据库原⽂:https:///p/d0bbdf1974bd
采⽤⽅案:使⽤spring 的 aop 技术切到⾃定义注解上,针对不同注解标志进⾏参数解析,记录⽇志
缺点是要针对每个不同的注解标志进⾏分别取注解标志,获取参数进⾏⽇志记录输出
1. 需要引⽤的依赖
<!--spring切⾯aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
在application.properties⽂件⾥加这样⼀条配置
spring.aop.auto=true //这个配置我的例⼦中没有加也正常运⾏
2. 创建实体类
public class SysLog implements Serializable {
private Long id;
private String username; //⽤户名
private String operation; //操作
private String method; //⽅法名
private String params; //参数
private String ip; //ip地址
private Date createDate; //操作时间
//创建getter和setter⽅法
}
3. 使⽤spring 的 aop 技术切到⾃定义注解上,所以先创建⼀个⾃定义注解类
import ng.annotation.*;
/**
* ⾃定义注解类
*/
@Target(ElementType.METHOD) //注解放置的⽬标位置,METHOD是可注解在⽅法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执⾏
@Documented //⽣成⽂档
public @interface MyLog {
String value() default "";
}
4. 创建aop切⾯实现类
import com.alibaba.fastjson.JSON;
import com.qfedu.rongzaiboot.annotation.MyLog;
import com.qfedu.rongzaiboot.entity.SysLog;
import com.qfedu.rongzaiboot.service.SysLogService;
import com.qfedu.rongzaiboot.utils.HttpContextUtils;
import com.qfedu.rongzaiboot.utils.IPUtils;
import com.qfedu.rongzaiboot.utils.ShiroUtils;
import ng.JoinPoint;
import ng.annotation.AfterReturning;
import ng.annotation.Aspect;
import ng.annotation.Pointcut;
import ng.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import ponent;
import javax.servlet.http.HttpServletRequest;
import ng.reflect.Method;
import java.util.Date;
/**
* 系统⽇志:切⾯处理类
*/
@Aspect
@Component
public class SysLogAspect {
@Autowired
private SysLogService sysLogService;
//定义切点 @Pointcut
//在注解的位置切⼊代码
@Pointcut("@annotation( com.qfedu.rongzaiboot.annotation.MyLog)")
public void logPoinCut() {
}
//切⾯配置通知
@AfterReturning("logPoinCut()")
public void saveSysLog(JoinPoint joinPoint) {
System.out.println("切⾯。
");
//保存⽇志
SysLog sysLog = new SysLog();
//从切⾯织⼊点处通过反射机制获取织⼊点处的⽅法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//获取切⼊点所在的⽅法
Method method = signature.getMethod();
//获取操作
MyLog myLog = method.getAnnotation(MyLog.class);
if (myLog != null) {
String value = myLog.value();
sysLog.setOperation(value);//保存获取的操作
}
//获取请求的类名
String className = joinPoint.getTarget().getClass().getName();
//获取请求的⽅法名
String methodName = method.getName();
sysLog.setMethod(className + "." + methodName);
//请求的参数
Object[] args = joinPoint.getArgs();
//将参数所在的数组转换成json
String params = JSON.toJSONString(args);
sysLog.setParams(params);
sysLog.setCreateDate(new Date());
//获取⽤户名
sysLog.setUsername(ShiroUtils.getUserEntity().getUsername());
//获取⽤户ip地址
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
sysLog.setIp(IPUtils.getIpAddr(request));
//调⽤service保存SysLog实体类到数据库
sysLogService.save(sysLog);
}
}
5. 接下来就可以在需要监控的⽅法上添加 aop的⾃定义注解格式为 @+⾃定义注解的类名@MyLog //例如在contoller类的⽅法上加注解
@RestController
@RequestMapping("/sys/menu")
public class SysMenuController extends AbstractController {
@Autowired
private SysMenuService sysMenuService;
@MyLog(value = "删除菜单记录") //这⾥添加了AOP的⾃定义注解
@PostMapping("/del")
public R deleteBatch(@RequestBody Long[] menuIds) {
for (Long menuId : menuIds) {
if (menuId <= 31) {
return R.error("系统菜单,不能删除");
}
}
sysMenuService.deleteBatch(menuIds);
return R.ok("删除成功");
}
}
6. 执⾏上⾯的⽅法操作后,会将记录保存到数据库
作者:东⽅舵⼿
链接:https:///p/d0bbdf1974bd
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。