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);
|
|
}
|
|
}
|