| | |
| | | //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<String, Object> 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); |
| | | // |
| | | // } |
| | | // |
| | | //} |
| | | package com.whyc.aop; |
| | | |
| | | import com.google.gson.JsonElement; |
| | | import com.google.gson.JsonObject; |
| | | import com.google.gson.JsonPrimitive; |
| | | import com.whyc.dto.Response; |
| | | import com.whyc.service.UserLogService; |
| | | 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 UserLogService 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.*(..))" |
| | | ) |
| | | 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 category = 0; |
| | | Integer type = 0; |
| | | String operationTypeName = ""; |
| | | |
| | | //TODO 下面这段将优化,采用switch case 代替if else,提高代码可读性和优化性能 |
| | | //系统级 |
| | | /*if (classNameTrue.equals("UserInfController")) { |
| | | if(methodName.contains("add")){ //用户新增 |
| | | category = OperationLogEnum.TYPE_1_SYS.getType(); |
| | | type = OperationLogEnum.TYPE_2_USER_ADD.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_USER_ADD.getName(); |
| | | |
| | | }else if(methodName.contains("update")){ //用户修改 |
| | | category = OperationLogEnum.TYPE_1_SYS.getType(); |
| | | type = OperationLogEnum.TYPE_2_USER_UPDATE.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_USER_UPDATE.getName(); |
| | | }else if(methodName.contains("delete")){ //用户删除 |
| | | category = OperationLogEnum.TYPE_1_SYS.getType(); |
| | | type = OperationLogEnum.TYPE_2_USER_DELETE.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_USER_DELETE.getName(); |
| | | }else if(methodName.contains("resetSnId")){ //密码重置 |
| | | category = OperationLogEnum.TYPE_1_SYS.getType(); |
| | | type = 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()){ //用户登录 |
| | | category = OperationLogEnum.TYPE_1_SYS.getType(); |
| | | type = OperationLogEnum.TYPE_2_LOGIN.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_LOGIN.getName(); |
| | | }else { //用户登录失败 |
| | | category = OperationLogEnum.TYPE_1_SYS.getType(); |
| | | type = OperationLogEnum.TYPE_2_LOGIN_FAIL.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_LOGIN_FAIL.getName(); |
| | | } |
| | | } |
| | | else if(methodName.equals("logout")){ //用户退出 |
| | | category = OperationLogEnum.TYPE_1_SYS.getType(); |
| | | type = OperationLogEnum.TYPE_2_LOGOUT.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_LOGOUT.getName(); |
| | | } |
| | | else if(methodName.equals("changeSnId")){ //用户密码重置 |
| | | category = OperationLogEnum.TYPE_1_SYS.getType(); |
| | | type = 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")){ |
| | | category = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type = OperationLogEnum.TYPE_2_ALARM.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_ALARM.getName(); |
| | | } |
| | | }else if(classNameTrue.contains("plan")){ |
| | | if(methodName.startsWith("static")){//统计计划 |
| | | category = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type = 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<String, Object> 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(); |
| | | //TODO 如存在需要忽略的参数,这里进行处理 |
| | | /*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()); |
| | | } |
| | | |
| | | map.put(parameterNames[i], paramBuilder.toString()); |
| | | } |
| | | } |
| | | //登录接口的密码,不存储 |
| | | if (methodSignature.contains("LoginController.login")) { |
| | | map.put("pwd","密码密文保密,忽略存储"); |
| | | } |
| | | //TODO 修改密码接口的密码,也不存储 |
| | | /*else if(methodSignature.contains("LoginController.changeSnId")){ |
| | | map.put("oldSnId","旧密码密文保密,忽略存储"); |
| | | map.put("newSnId","新密码密文保密,忽略存储"); |
| | | }*/ |
| | | String message = "执行了" + className + "的" + operationTypeName + "操作."; |
| | | String messageDetail = "具体调用方法为:" + methodName + ",具体参数为:" + map.toString(); |
| | | |
| | | service.add(category, type, message, messageDetail); |
| | | |
| | | } |
| | | |
| | | } |