操作日志存储到数据库

本文介绍了如何使用Java注解和AOP(面向切面编程)来创建一个日志拦截器,自动记录操作日志并保存到数据库。首先定义了一个自定义注解`Ulog`,然后创建了`SysLogAspect`切面类,利用`@Pointcut`定义切点,`@AfterReturning`处理返回后保存日志。在Controller方法上使用`@Ulog`注解,指定操作内容。最后,在配置文件中开启AOP自动代理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值