上码
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) @Documentedpublic @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@Componentpublic 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;@Datapublic 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;}