package com.app.aspect;
|
|
import com.alibaba.fastjson.JSON;
|
import com.auth0.jwt.JWT;
|
import com.system.log.entity.SysLog;
|
import com.system.log.service.SysLogService;
|
import com.system.user.entity.SysUser;
|
|
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.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.context.request.RequestAttributes;
|
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import java.io.UnsupportedEncodingException;
|
import java.lang.reflect.Method;
|
import java.util.Date;
|
|
/**
|
* 系统日志:切面处理类
|
*/
|
@Aspect
|
@Component
|
public class SysLogAspect {
|
|
@Autowired
|
private SysLogService sysLogService;
|
|
//定义切点 @Pointcut
|
//在注解的位置切入代码
|
// @Pointcut("@annotation( com.app.aspect.MyLog)")
|
@Pointcut("execution(public * com.*.*.controller..*.*(..))")
|
public void logPoinCut() {
|
}
|
|
//切面 配置通知
|
@AfterReturning("logPoinCut()")
|
public void saveSysLog(JoinPoint joinPoint) {
|
System.out.println("访问日志。。。。。。" + new Date());
|
//保存日志
|
SysLog sysLog = new SysLog();
|
|
//从切面织入点处通过反射机制获取织入点处的方法
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
//获取切入点所在的方法
|
Method method = signature.getMethod();
|
|
//获取操作
|
/* MyLog myLog = method.getAnnotation(MyLog.class);
|
if (myLog != null) {
|
String value = myLog.value();
|
sysLog.setOperation(value);//保存获取的操作
|
}*/
|
|
//获取请求的类名
|
String className = joinPoint.getTarget().getClass().getName();
|
//获取请求的方法名
|
String methodName = method.getName();
|
sysLog.setMethod(className + "." + methodName);
|
|
//请求的参数
|
Object[] args = joinPoint.getArgs();
|
//将参数所在的数组转换成json
|
String params = JSON.toJSONString(args);
|
|
//System.out.println("String length: " + params.length());
|
//System.out.println("Byte array length: " + params.getBytes().length);
|
|
//20181225-fyx-参数过大(一般是文件)
|
if(params.length()>=255){
|
params = params.substring(0, 254);
|
}
|
System.out.println("String: " + params);
|
|
try {
|
params = new String(params.getBytes("ISO8859-1"), "GBK");
|
} catch (UnsupportedEncodingException e1) {
|
// TODO Auto-generated catch block
|
e1.printStackTrace();
|
}
|
//System.out.println(params);
|
|
|
sysLog.setParams(params);
|
|
sysLog.setCreatedTime(new Date());
|
|
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
|
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
|
HttpServletRequest request = sra.getRequest();
|
|
String token = request.getHeader("X-Token");// 从 http 请求头中取出 token
|
if(token != null){
|
String userCode = JWT.decode(token).getAudience().get(0);
|
//获取用户名
|
sysLog.setUsername(userCode);
|
}
|
|
//获取用户ip地址
|
sysLog.setIp(IpUtil.getIpAddr(request));
|
|
//调用service保存SysLog实体类到数据库
|
try {
|
//sysLogService.add(sysLog);
|
} catch (Exception e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
System.out.println(e.toString());
|
}
|
}
|
|
}
|