New file |
| | |
| | | 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.equals("CKPowerDevSignalSetController") |
| | | ||classNameTrue.equals("CKPowerDevRtSetController")){ //电源设备设置 |
| | | if(methodName.startsWith("update")){ |
| | | type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type2 = OperationLogEnum.TYPE_2_POWER_UPDATE.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_POWER_UPDATE.getName(); |
| | | } |
| | | }else if(classNameTrue.equals("CKPowerDevBattRtStateSetController")){ //核容设备信息相关设置 |
| | | if(methodName.startsWith("update")){ |
| | | type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type2 = OperationLogEnum.TYPE_2_BATTERY_UPDATE.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_BATTERY_UPDATE.getName(); |
| | | } |
| | | } |
| | | else if(classNameTrue.equals("CKPowerDevHrTestParamController")) { //核容设备遥调遥控 |
| | | if (methodName.startsWith("update")) { |
| | | type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type2 = OperationLogEnum.TYPE_2_BATTERY_TEST_PARAM_UPDATE.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_BATTERY_TEST_PARAM_UPDATE.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("BreakerInfController")){ //断路器 |
| | | type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type2 = OperationLogEnum.TYPE_2_BREAKER.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_BREAKER.getName(); |
| | | } |
| | | else if(classNameTrue.contains("CKPowerDevBreakerControlController")){ //断路器控制 |
| | | type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type2 = OperationLogEnum.TYPE_2_BREAKER_CONTROL.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_BREAKER_CONTROL.getName(); |
| | | } |
| | | else if(classNameTrue.contains("GatewayInfController")){ //网关 |
| | | type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type2 = OperationLogEnum.TYPE_2_GATEWAY.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_GATEWAY.getName(); |
| | | } |
| | | else if(classNameTrue.contains("CKPowerDevModecontrolController")){ //电源设备模块控制操作 |
| | | type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type2 = OperationLogEnum.TYPE_2_POWER_MODE_CONTROL.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_POWER_MODE_CONTROL.getName(); |
| | | } |
| | | else if(classNameTrue.contains("CKPowerDevModeparamController")){ //电源设备模块参数操作 |
| | | type1 = OperationLogEnum.TYPE_1_SERVICE.getType(); |
| | | type2 = OperationLogEnum.TYPE_2_POWER_MODE_PARAM.getType(); |
| | | operationTypeName = OperationLogEnum.TYPE_2_POWER_MODE_PARAM.getName(); |
| | | } |
| | | // TODO else if() |
| | | |
| | | 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); |
| | | |
| | | } |
| | | |
| | | } |