/**
|
* Copyright (c) 2018 人人开源 All rights reserved.
|
*
|
* https://www.renren.io
|
*
|
* 版权所有,侵权必究!
|
*/
|
|
package com.zt.core.aspect;
|
|
import com.alibaba.fastjson.JSON;
|
import com.zt.common.annotation.LogOperation;
|
import com.zt.common.utils.HttpContextUtils;
|
import com.zt.common.utils.IpUtils;
|
import com.zt.core.context.User;
|
import com.zt.core.context.UserContext;
|
import com.zt.modules.log.enums.OperationStatusEnum;
|
import com.zt.modules.log.model.SysLogOperation;
|
import com.zt.modules.log.service.SysLogOperationService;
|
import org.aspectj.lang.JoinPoint;
|
import org.aspectj.lang.ProceedingJoinPoint;
|
import org.aspectj.lang.annotation.Around;
|
import org.aspectj.lang.annotation.Aspect;
|
import org.aspectj.lang.annotation.Before;
|
import org.aspectj.lang.annotation.Pointcut;
|
import org.aspectj.lang.reflect.MethodSignature;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.stereotype.Component;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.lang.reflect.Method;
|
|
/**
|
* 操作日志,切面处理类
|
*
|
* @author Mark sunlightcs@gmail.com
|
*/
|
@Aspect
|
@Component("log")
|
public class LogOperationAspect {
|
@Autowired
|
private SysLogOperationService sysLogOperationService;
|
|
@Pointcut("@annotation(com.zt.common.annotation.LogOperation)")
|
public void logPointCut() {
|
|
}
|
|
@Before("logPointCut()")
|
public Object before(JoinPoint point) throws Throwable {
|
long beginTime = System.currentTimeMillis();
|
try {
|
//执行方法
|
Object result = true; //point.proceed();
|
//执行时长(毫秒)
|
long time = System.currentTimeMillis() - beginTime;
|
//保存日志
|
saveLog(point, time, OperationStatusEnum.SUCCESS.value());
|
return result;
|
}catch(Exception e) {
|
//执行时长(毫秒)
|
long time = System.currentTimeMillis() - beginTime;
|
//保存日志
|
saveLog(point, time, OperationStatusEnum.FAIL.value());
|
throw e;
|
}
|
}
|
|
@Around("logPointCut()")
|
public Object around(ProceedingJoinPoint point) throws Throwable {
|
long beginTime = System.currentTimeMillis();
|
try {
|
//执行方法
|
Object result = point.proceed();
|
//执行时长(毫秒)
|
long time = System.currentTimeMillis() - beginTime;
|
//保存日志
|
saveLog(point, time, OperationStatusEnum.SUCCESS.value());
|
return result;
|
}catch(Exception e) {
|
//执行时长(毫秒)
|
long time = System.currentTimeMillis() - beginTime;
|
//保存日志
|
saveLog(point, time, OperationStatusEnum.FAIL.value());
|
throw e;
|
}
|
}
|
private void saveLog(JoinPoint joinPoint, long time, Integer status) throws Exception {
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
Method method = joinPoint.getTarget().getClass().getDeclaredMethod(signature.getName(), signature.getParameterTypes());
|
LogOperation annotation = method.getAnnotation(LogOperation.class);
|
|
SysLogOperation log = new SysLogOperation();
|
if(annotation != null){
|
//注解上的描述
|
log.setOperation(annotation.value());
|
}
|
|
//登录用户信息
|
User user = UserContext.getUser();
|
if(user != null){
|
log.setCreatorName(user.getUsername());
|
}
|
|
log.setStatus(status);
|
log.setRequestTime((int)time);
|
|
//请求相关信息
|
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
|
log.setIp(IpUtils.getIpAddr(request));
|
log.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));
|
log.setRequestUri(request.getRequestURI());
|
log.setRequestMethod(request.getMethod());
|
|
//请求参数
|
Object[] args = joinPoint.getArgs();
|
try{
|
String params = JSON.toJSONString(args[0]);
|
log.setRequestParams(params);
|
}catch (Exception e){
|
|
}
|
// log.setIsDelete(0);
|
|
//保存到DB
|
sysLogOperationService.insert(log);
|
}
|
}
|