package com.whyc.aop; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.whyc.constant.OperationLogEnum; import com.whyc.dto.Response; import com.whyc.service.OperationLogService; import com.whyc.util.JsonUtil; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; 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 java.util.HashMap; /** * 定义aop,对特定的接口进行内容捕捉,生成操作日志 * 切面为controller * 切点为Point表达式 * 具体连接点为JoinPoint * 处理方式为doAfterReturning */ @Component @Aspect public class OperationLogAspect { @Autowired private OperationLogService service; /**定义切点*/ @Pointcut(value = "execution(public * com.whyc..controller.*.add*(..))" + "|| execution(public * com.whyc..controller.*.delete*(..))" + "|| execution(public * com.whyc..controller.*.update*(..))" + "|| execution(public * com.whyc..controller.LoginController.*(..))" + "|| execution(public * com.whyc..controller.UserInfController.resetSnId*(..))" ) private void operationLogPointcut(){}; /**aop处理类,对捕捉到的切点接口,进行数据处理*/ @AfterReturning(pointcut = "operationLogPointcut()",returning = "resp") public void doAfterReturnOperation(JoinPoint point,Object resp){ Response response = (Response) resp; Signature signature = point.getSignature(); String methodSignature = signature.toString(); //方法名 // e.g:update String methodName = signature.getName(); //执行的类全名 // e.g: com.whyc.controller.CKPowerDevRtSetController String fullClassName = signature.getDeclaringTypeName(); //获取类型 String[] fullClassNameSplit = fullClassName.split("\\."); //类名 // e.g: CKPowerDevRtSetController String classNameTrue = fullClassNameSplit[fullClassNameSplit.length - 1]; Integer type1 = 0; Integer type2 = 0; String operationTypeName = ""; //系统级 if (classNameTrue.equals("UserInfController")) { if(methodName.contains("add")){ //用户新增 type1 = OperationLogEnum.TYPE_1_SYS.getType(); type2 = OperationLogEnum.TYPE_2_USER_ADD.getType(); operationTypeName = OperationLogEnum.TYPE_2_USER_ADD.getName(); }else if(methodName.contains("update")){ //用户修改 type1 = OperationLogEnum.TYPE_1_SYS.getType(); type2 = OperationLogEnum.TYPE_2_USER_UPDATE.getType(); operationTypeName = OperationLogEnum.TYPE_2_USER_UPDATE.getName(); }else if(methodName.contains("delete")){ //用户删除 type1 = OperationLogEnum.TYPE_1_SYS.getType(); type2 = OperationLogEnum.TYPE_2_USER_DELETE.getType(); operationTypeName = OperationLogEnum.TYPE_2_USER_DELETE.getName(); }else if(methodName.contains("resetSnId")){ //密码重置 type1 = OperationLogEnum.TYPE_1_SYS.getType(); type2 = OperationLogEnum.TYPE_2_USER_UPDATE_PASSWORD.getType(); operationTypeName = OperationLogEnum.TYPE_2_USER_UPDATE_PASSWORD.getName(); } }else if(classNameTrue.equals("LoginController")){ if(methodName.equals("login")){ if((boolean) response.getData()){ //用户登录 type1 = OperationLogEnum.TYPE_1_SYS.getType(); type2 = OperationLogEnum.TYPE_2_LOGIN.getType(); operationTypeName = OperationLogEnum.TYPE_2_LOGIN.getName(); }else { //用户登录失败 type1 = OperationLogEnum.TYPE_1_SYS.getType(); type2 = OperationLogEnum.TYPE_2_LOGIN_FAIL.getType(); operationTypeName = OperationLogEnum.TYPE_2_LOGIN_FAIL.getName(); } } else if(methodName.equals("logout")){ //用户退出 type1 = OperationLogEnum.TYPE_1_SYS.getType(); type2 = OperationLogEnum.TYPE_2_LOGOUT.getType(); operationTypeName = OperationLogEnum.TYPE_2_LOGOUT.getName(); } else if(methodName.equals("changeSnId")){ //用户密码重置 type1 = OperationLogEnum.TYPE_1_SYS.getType(); type2 = OperationLogEnum.TYPE_2_USER_UPDATE_PASSWORD.getType(); operationTypeName = OperationLogEnum.TYPE_2_USER_UPDATE_PASSWORD.getName(); } }else if(classNameTrue.contains("Alarm") ||classNameTrue.contains("Alm")){ //告警设置 if(methodName.startsWith("update")){ type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); type2 = OperationLogEnum.TYPE_2_ALARM.getType(); operationTypeName = OperationLogEnum.TYPE_2_ALARM.getName(); } }else if(classNameTrue.contains("plan")){ if(methodName.startsWith("static")){//统计计划 type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); type2 = OperationLogEnum.TYPE_2_PLAN_MON.getType(); operationTypeName = OperationLogEnum.TYPE_2_PLAN_MON.getName(); } } String module = "模块"; String className = classNameTrue.replace("Controller", module); /* //操作时间 Date operationTime = new Date(); //客户端ip HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); String terminalIp = request.getRemoteAddr();*/ //操作信息 //获取切点方法信息 String[] parameterNames = ((MethodSignature) signature).getParameterNames(); Object[] args = point.getArgs(); HashMap map = new HashMap<>(); for (int i = 0; i < parameterNames.length; i++) { if (args[i] != null) { StringBuilder paramBuilder = new StringBuilder(); //String param = args[i].toString(); try { JsonObject paramJsonObject = JsonUtil.getGson().toJsonTree(args[i]).getAsJsonObject(); if(paramJsonObject.has("logList")){ paramJsonObject.remove("logList"); JsonElement jsonElement = new JsonPrimitive("logList字段忽略存储"); paramJsonObject.add("logList",jsonElement); } paramBuilder.append(paramJsonObject.toString()); }catch (Exception e){ paramBuilder.append(args[i].toString()); } /*String[] paramSetArr = param.split(","); int paramSetLength = paramSetArr.length; for (int j = 0; j < paramSetLength; j++) { String paramSet = paramSetArr[j]; if(j == 0){ //首行,特殊情况,存在null但是要保留 if(paramSet.endsWith("=null")){ if(paramSet.contains("(")){ paramBuilder.append(paramSet.substring(0,paramSet.lastIndexOf("(")+1)); continue; } } }else if(j == paramSetLength -1){ //末行,特殊情况,存在null但是要保留 if(paramSet.endsWith("=null)")){ paramBuilder.append(")"); continue; } } //其他非null情况 if(!paramSet.endsWith("=null")){ paramBuilder.append(paramSet); } }*/ //map.put(parameterNames[i], args[i].toString()); map.put(parameterNames[i], paramBuilder.toString()); } } //登录接口的密码,不存储 if (methodSignature.contains("LoginController.login")) { map.put("usnId","密码密文保密,忽略存储"); } //修改密码接口的密码,也不存储 else if(methodSignature.contains("LoginController.changeSnId")){ map.put("oldSnId","旧密码密文保密,忽略存储"); map.put("newSnId","新密码密文保密,忽略存储"); } String operationMsg = "执行了" + className + "的" + operationTypeName + "操作."; String operationDetail = "具体调用方法为:" + methodName + ",具体参数为:" + map.toString(); service.record(type1, type2, operationMsg, operationDetail); } }