java 设置操作日志切入点

package com.jrtc.backend.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.auth0.jwt.JWT;
import com.jrtc.base.annotations.OperationLogAnnotation;
import com.jrtc.base.entity.bo.AdminBO;
import com.jrtc.base.entity.vo.SysOperLogVO;
import com.jrtc.base.util.IpUtil;
import com.jrtc.dao.AdminDao;
import org.apache.commons.lang.ArrayUtils;
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.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;


@Aspect
@Component
public class OperationLogAspect {

    @Autowired
    private AdminDao adminDao;

    /**
     * 设置操作日志切入点   在注解的位置切入代码
     */
    @Pointcut("@annotation(com.jrtc.base.annotations.OperationLogAnnotation)")
    public void operLogPoinCut() {
    }

    @AfterReturning(returning = "result", value = "operLogPoinCut()")
    public void saveOperLog(JoinPoint joinPoint, Object result) throws Throwable {
        // 获取RequestAttributes
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        // 从获取RequestAttributes中获取HttpServletRequest的信息
        HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
        try {
            SysOperLogVO sysOperLogVO = new SysOperLogVO();
            //获取登录人信息
            String token = request.getHeader("token");
            String mobile = JWT.decode(token).getAudience().get(0);
            AdminBO adminBO = adminDao.queryAdminInfoByMobile(mobile);
            sysOperLogVO.setAdminId(adminBO.getId());
            // 从切面织入点处通过反射机制获取织入点处的方法
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            //获取切入点所在的方法
            Method method = signature.getMethod();
            //获取操作
            OperationLogAnnotation annotation = method.getAnnotation(OperationLogAnnotation.class);
            Object[] args = joinPoint.getArgs();
            if(args.length>0){
                Stream<?> stream = ArrayUtils.isEmpty(args) ? Stream.empty() : Arrays.stream(args);
                List<Object> logArgs = stream
                        .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
                        .collect(Collectors.toList());
                //过滤后序列化无异常
                String jsonStr = JSONObject.toJSONString(logArgs);
                sysOperLogVO.setOperData(jsonStr);
            }
            if (annotation != null) {
                sysOperLogVO.setOperModule(annotation.operModule());
                sysOperLogVO.setOperType(annotation.operType());
                sysOperLogVO.setOperDesc(annotation.operDesc());
            }
            //操作IP
            IpUtil ipUtil = new IpUtil();
            sysOperLogVO.setIp(ipUtil.getIpAddr(request));
            //保存日志
            adminDao.addSysOperLog(sysOperLogVO);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值