使用spring 的 AOP 实现操作日志记录功能

一、添加 maven 依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
 </dependency>

二、定义一个操作日志注解类 OpeLog (需要记录模块、操作类型的可以把注释的解开,因我这里只记录增加和修改的操作记录,所以只要一个操作说明)

package com.tond.zgxsj.config;

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

@Target(ElementType.METHOD)            //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME)    //表示这是一个运行时注解,即运行起来之后
public @interface OpeLog {

    //String operModul() default ""; // 操作模块
    //String operType() default "";  // 操作类型
    String operDesc() default "";  // 操作说明
}

三、创建操作日志切面处理类

package com.tond.zgxsj.config;

import com.hzsparrow.business.base.contant.LoginUserEnum;
import com.hzsparrow.business.base.vo.LoginVO;
import com.tond.zgxsj.entity.ZgxOperationLogEntity;
import com.tond.zgxsj.service.ZgxOperationLogService;
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 javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Date;
import java.util.UUID;

@Aspect
@Component
public class OpeLogAspect {

    @Autowired
    private ZgxOperationLogService zgxOperationLogService;

    //定义切点 @Pointcut  在注解的位置切入代码
    @Pointcut("@annotation(com.tond.zgxsj.config.OpeLog)")
    public void logPoinCut() {
    }

    @AfterReturning("logPoinCut()")
    public void savaOpeLog(JoinPoint joinPoint){
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        HttpServletRequest request = attr.getRequest();
        HttpSession session = request.getSession(true);
        ZgxOperationLogEntity sysLog = new ZgxOperationLogEntity();
        //从切面织入点处通过反射机制获取织入点处的方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        //获取切入点所在的方法
        Method method = signature.getMethod();

        //获取操作
        OpeLog opeLog = method.getAnnotation(OpeLog.class);
        if (opeLog != null) {
            String value = opeLog.operDesc();
            sysLog.setOperation(value);//保存获取的操作
        }
        //获取请求的类名
        String className = joinPoint.getTarget().getClass().getName();
        //获取请求的方法名
        String methodName = method.getName();
        //请求的参数
        Object[] args = joinPoint.getArgs();
        //将参数所在的数组转换成json
        String params = Arrays.toString(joinPoint.getArgs());
        System.out.println("方法的参数:"+params);
        /*StringBuffer rs=new StringBuffer();
        String paramClass;
        for (Object object2 : args) {
            //取到参数的类型
            paramClass=object2.getClass().getName();
            paramClass=paramClass.substring(paramClass.lastIndexOf(".")+1);
            rs.append("[参数,类型]"+paramClass+",值:(id:"
                    +joinPoint.getArgs()[0]+")");
        }*/

        //获取用户
        LoginVO user = (LoginVO) session.getAttribute(LoginUserEnum.SESSION_USER.getFlag());
        sysLog.setUuid(UUID.randomUUID().toString());
        String opeDetail = "";
        if(user != null){
            sysLog.setHsuId(user.getUserId());
            sysLog.setHsuAccount(user.getAccount());
            sysLog.setHsuName(user.getUserName());
            opeDetail = "当前登陆人:{"+user.getUserName()+"},类名:{"+className+"},方法名:{"+methodName+"},参数:{"+params+"}";

            //请求的时间
            sysLog.setOpeTime(new Date());
            //获取用户ip地址
            if(session.getAttribute("userIP") != null ){
                sysLog.setHsuIp(session.getAttribute("userIP").toString());
            }
            sysLog.setOpeDetail(opeDetail);
            //调用service保存SysLog实体类到数据库
            zgxOperationLogService.insertOperationLog(sysLog);
        }

    }
}

四、最后在需要记录日志的Controller上添加注解

 /**
     * 创建
     *
     * @param entity
     * @return
     */
    @OpeLog(operDesc="添加直管县信息")
    @RequestMapping("/save")
    public ResultDTO<Object> save(@Validated({Create.class, Default.class}) ZgxInfoEntity entity) {
        return zgxInfoService.save(entity, getSessionUser());
    }

    /**
     * 修改
     *
     * @param entity
     * @return
     */
    @OpeLog(operDesc="修改直管县信息")
    @RequestMapping("/edit")
    public ResultDTO<Object> edit(@Validated({Edit.class, Default.class}) ZgxInfoEntity entity) {
        return zgxInfoService.edit(entity, getSessionUser());
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值