上码

1. 引入aop依赖

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

2. 注解类

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 操作日志注解
 */
@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented
public @interface OperLog {
    String operModul() default "";//操作模块名称
    String operType() default "";//操作类型
    String operDesc() default "";//功能描述
}

3切面方法

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
 * 切面处理类,操作日志处理
 */
@Aspect
@Component
public class OperLogAspect {
    @Autowired
 private TSysLogService logService;
    private Logger logger = LoggerFactory.getLogger(getClass());
    private String params ="";
    @Pointcut("@annotation(org.student.aspect.OperLog)")
    public void operLogPoinCut() {
    }
    @Before("@annotation(org.student.aspect.OperLog)")
    public void beforeController(JoinPoint joinPoint){
        Object[] o = joinPoint.getArgs();
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
        Map<String, String> rtnMap = converMap(request.getParameterMap());
        //通过判断contenttype 区分数据类型
        if(request.getContentType().equals("application/json")){
            params = JSONObject.toJSONString(o[0]);
        }else {
            params = JSON.toJSONString(rtnMap);
        }
        request.setAttribute("body",o[0]);
    }
    @AfterReturning(value = "operLogPoinCut()", returning = "keys")
    public void saveOperLog(JoinPoint joinPoint, Object keys) {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = (HttpServletRequest) requestAttributes
            .resolveReference(RequestAttributes.REFERENCE_REQUEST);
            
        //TUser loginUser = userService.getLoginUser(request); //获取用户信息
        TSysLog operlog = new TSysLog();
        try {
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            OperLog opLog = method.getAnnotation(OperLog.class);
            if (opLog != null) {
                String operModul = opLog.operModul();
                String operType = opLog.operType();
                String operDesc = opLog.operDesc();
                operlog.setOperMod(operModul); // 模块
                operlog.setOperType(operType); // 类型
                operlog.setOperDesc(operDesc); // 描述
            }
            String className = joinPoint.getTarget().getClass().getName();
            String methodName = method.getName();
            methodName = className + "." + methodName;
            operlog.setOperMethod(methodName);//请求方法名
            operlog.setOperRequParam(params);//请求数据
            operlog.setOperRespParam(JSON.toJSONString(keys));//响应数据
            //operlog.setUserId(loginUser.getId());
            //operlog.setAccount(loginUser.getAccount());
            //operlog.setDepartId(loginUser.getDepartId());
            operlog.setOperIp(getRemoteAddr(request));//请求ip
            operlog.setOperUri(request.getRequestURI());
            logService.insertLog(operlog);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
 * 转换request 请求参数
 *
 */ public Map<String, String> converMap(Map<String, String[]> paramMap) {
        Map<String, String> rtnMap = new HashMap<String, String>();
        for (String key : paramMap.keySet()) {
            rtnMap.put(key, paramMap.get(key)[0]);
        }
        return rtnMap;
    }
    public static String getRemoteAddr(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
}

4.使用案例

@RequestMapping(value = "/saveInfo", method = RequestMethod.POST)
@OperLog(operDesc = "功能描述", operType ="操作类型", operModul = "操作模块名称")
public ResponseResult saveInfo(@RequestBody TStudent student) {
    ResponseResult<Integer> result = studentService.saveInfo(student);
    return result;
}

5.表结构及类

import lombok.Data;
import java.util.Date;
@Data
public class TSysLog {
    private Long id;
    private String operMod;
    private String operType;
    private String operDesc;
    private String operRequParam;
    private String operRespParam;
    private String account;
    private Long userId;
    private Long departId;
    private String operUri;
    private String operIp;
    private Date createTime;
    private String operVar;
    private String operExtra;
    private String operMethod;
}

image.png


在瘦了
38 声望5 粉丝

睿智哦