package com.panzhihua.grid_app.aop;
|
|
import java.io.BufferedReader;
|
import java.io.IOException;
|
import java.lang.reflect.Method;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
|
import org.aspectj.lang.JoinPoint;
|
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.stereotype.Component;
|
import org.springframework.util.ObjectUtils;
|
import org.springframework.web.context.request.RequestAttributes;
|
import org.springframework.web.context.request.RequestContextHolder;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.panzhihua.common.constants.Constants;
|
import com.panzhihua.common.constants.TokenConstant;
|
import com.panzhihua.common.interfaces.OperLog;
|
import com.panzhihua.common.model.vos.LoginUserInfoVO;
|
import com.panzhihua.common.model.vos.user.SysOperLogVO;
|
import com.panzhihua.common.service.user.UserService;
|
import com.panzhihua.common.utlis.AES;
|
import com.panzhihua.common.utlis.IPUtil;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
/**
|
* 切面处理类,操作日志异常日志记录处理
|
*
|
* @author wu
|
* @date 2019/03/21
|
*/
|
@Slf4j
|
@Aspect
|
@Component
|
public class OperLogAspect {
|
|
@Resource
|
private UserService userService;
|
|
/**
|
* 设置操作日志切入点 记录操作日志 在注解的位置切入代码
|
*/
|
@Pointcut("@annotation(com.panzhihua.common.interfaces.OperLog)")
|
public void operLogPoinCut() {}
|
|
// /**
|
// * 设置操作异常切入点记录异常日志 扫描所有controller包下操作
|
// */
|
// @Pointcut("execution(* com.hyd.zcar.cms.controller..*.*(..))")
|
// public void operExceptionLogPoinCut() {
|
// }
|
|
/**
|
* 正常返回通知,拦截用户操作日志,连接点正常执行完成后执行, 如果连接点抛出异常,则不会执行
|
*
|
* @param joinPoint
|
* 切入点
|
* @param keys
|
* 返回结果
|
*/
|
@AfterReturning(value = "operLogPoinCut()", returning = "keys")
|
public void saveOperLog(JoinPoint joinPoint, Object keys) {
|
log.info("进入切面");
|
// 获取RequestAttributes
|
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
|
// 从获取RequestAttributes中获取HttpServletRequest的信息
|
HttpServletRequest request =
|
(HttpServletRequest)requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
|
// 登录对象信息
|
String userInfo = request.getHeader(TokenConstant.TOKEN_USERINFO);
|
boolean empty = ObjectUtils.isEmpty(userInfo);
|
if (empty) {
|
log.error("操作日志获取登录用户信息失败【{}】", joinPoint);
|
return;
|
}
|
byte[] bytes = AES.parseHexStr2Byte(userInfo);
|
byte[] decrypt = AES.decrypt(bytes, Constants.AES_KEY);
|
userInfo = new String(decrypt);
|
LoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(userInfo, LoginUserInfoVO.class);
|
|
SysOperLogVO operlog = new SysOperLogVO();
|
try {
|
|
// 从切面织入点处通过反射机制获取织入点处的方法
|
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
|
// 获取切入点所在的方法
|
Method method = signature.getMethod();
|
// 获取操作
|
OperLog opLog = method.getAnnotation(OperLog.class);
|
if (opLog != null) {
|
String operModul = opLog.operModul();
|
int operType = opLog.operType();
|
operlog.setTitle(operModul); // 操作模块
|
operlog.setBusinessType(operType); // 操作类型
|
}
|
// 获取请求的类名
|
String className = joinPoint.getTarget().getClass().getName();
|
// 获取请求的方法名
|
String methodName = method.getName();
|
methodName = className + "." + methodName;
|
|
operlog.setMethod(methodName); // 请求方法
|
|
if (joinPoint.getArgs().length > 0) {
|
for (Object o : joinPoint.getArgs()) {
|
if (o instanceof HttpServletRequest || o instanceof HttpServletResponse) {
|
continue;
|
}
|
operlog.setOperParam(JSONObject.toJSONString(o)); // 请求参数
|
}
|
}
|
|
operlog.setJsonResult(JSONObject.toJSONString(keys)); // 返回结果
|
operlog.setAccount(loginUserInfoVO.getAccount());
|
operlog.setOperName(loginUserInfoVO.getName()); // 请求用户名称
|
operlog.setOperIp(IPUtil.getIpAddress(request)); // 请求IP
|
operlog.setOperUrl(request.getRequestURI()); // 请求URI
|
operlog.setRequestMethod(request.getMethod());
|
operlog.setOperLocation(IPUtil.getIpBelongAddress(request));
|
operlog.setOperTime(new Date()); // 创建时间
|
operlog.setAccount(loginUserInfoVO.getAccount());
|
Long communityId = loginUserInfoVO.getCommunityId();
|
operlog.setCommunityId(null == communityId ? 0 : communityId);
|
userService.addOperLog(operlog);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
// /**
|
// * 异常返回通知,用于拦截异常日志信息 连接点抛出异常后执行
|
// *
|
// * @param joinPoint 切入点
|
// * @param e 异常信息
|
// */
|
// @AfterThrowing(pointcut = "operExceptionLogPoinCut()", throwing = "e")
|
// public void saveExceptionLog(JoinPoint joinPoint, Throwable e) {
|
// // 获取RequestAttributes
|
// RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
|
// // 从获取RequestAttributes中获取HttpServletRequest的信息
|
// HttpServletRequest request = (HttpServletRequest) requestAttributes
|
// .resolveReference(RequestAttributes.REFERENCE_REQUEST);
|
//
|
// ExceptionLog excepLog = new ExceptionLog();
|
// try {
|
// // 从切面织入点处通过反射机制获取织入点处的方法
|
// MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
// // 获取切入点所在的方法
|
// Method method = signature.getMethod();
|
// excepLog.setExcId(UuidUtil.get32UUID());
|
// // 获取请求的类名
|
// String className = joinPoint.getTarget().getClass().getName();
|
// // 获取请求的方法名
|
// String methodName = method.getName();
|
// methodName = className + "." + methodName;
|
// // 请求的参数
|
// Map<String, String> rtnMap = converMap(request.getParameterMap());
|
// // 将参数所在的数组转换成json
|
// String params = JSON.toJSONString(rtnMap);
|
// excepLog.setExcRequParam(params); // 请求参数
|
// excepLog.setOperMethod(methodName); // 请求方法名
|
// excepLog.setExcName(e.getClass().getName()); // 异常名称
|
// excepLog.setExcMessage(stackTraceToString(e.getClass().getName(), e.getMessage(), e.getStackTrace())); // 异常信息
|
// excepLog.setOperUserId(UserShiroUtil.getCurrentUserLoginName()); // 操作员ID
|
// excepLog.setOperUserName(UserShiroUtil.getCurrentUserName()); // 操作员名称
|
// excepLog.setOperUri(request.getRequestURI()); // 操作URI
|
// excepLog.setOperIp(IPUtil.getRemortIP(request)); // 操作员IP
|
// excepLog.setOperVer(operVer); // 操作版本号
|
// excepLog.setOperCreateTime(new Date()); // 发生异常时间
|
//
|
// exceptionLogService.insert(excepLog);
|
//
|
// } catch (Exception e2) {
|
// e2.printStackTrace();
|
// }
|
//
|
// }
|
|
/**
|
* 转换request 请求参数
|
*
|
* @param paramMap
|
* 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;
|
}
|
|
private String getPostData(HttpServletRequest request) {
|
StringBuffer data = new StringBuffer();
|
String line = null;
|
BufferedReader reader = null;
|
try {
|
reader = request.getReader();
|
while (null != (line = reader.readLine()))
|
data.append(line);
|
} catch (IOException e) {
|
} finally {
|
}
|
return data.toString();
|
}
|
|
/**
|
* 转换异常信息为字符串
|
*
|
* @param exceptionName
|
* 异常名称
|
* @param exceptionMessage
|
* 异常信息
|
* @param elements
|
* 堆栈信息
|
*/
|
public String stackTraceToString(String exceptionName, String exceptionMessage, StackTraceElement[] elements) {
|
StringBuffer strbuff = new StringBuffer();
|
for (StackTraceElement stet : elements) {
|
strbuff.append(stet + "\n");
|
}
|
String message = exceptionName + ":" + exceptionMessage + "\n\t" + strbuff.toString();
|
return message;
|
}
|
}
|