package com.dingdang.utils;
import com.alibaba.fastjson.JSON;
import com.dingdang.system.commonManager.entity.po.UserPO;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Value;
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.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Aspect
@Component
@Slf4j
public class WebLogAspect {
@Value("${session.sessionUserKey}")
private String sessionUserKey;
private String requestPath = null ;
private String userName = null ;
private Map,?> inputParamMap = null ;
private Map outputParamMap = null;
private long startTimeMillis = 0;
private long endTimeMillis = 0;
@Before("execution(* com.dingdang.controller.avaluation..*(..))")
public void doBeforeInServiceLayer(JoinPoint joinPoint) {
// 记录方法开始执行的时间
startTimeMillis = System.currentTimeMillis();
}
@After("execution(* com.dingdang.controller.avaluation..*.*(..))")
public void doAfterInServiceLayer(JoinPoint joinPoint) {
// 记录方法执行完成的时间
endTimeMillis = System.currentTimeMillis();
this.printOptLog();
}
@Around("execution(* com.dingdang.controller.avaluation..*.*(..))")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes)ra;
HttpServletRequest request = sra.getRequest();
// 从session中获取用户信息
UserPO user = SessionUtil.getUser(sessionUserKey);
if(user != null && !"".equals(user)){
userName = user.getName();
}else{
userName = "用户未登录" ;
}
// 获取输入参数
inputParamMap = request.getParameterMap();
// 获取请求地址
requestPath = request.getRequestURI();
// 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
outputParamMap = new HashMap();
// result的值就是被拦截方法的返回值
Object result = pjp.proceed();
outputParamMap.put("result", result);
return result;
}
private void printOptLog() {
String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTimeMillis);
log.info("n user:"+userName
+" url:"+requestPath+"; op_time:" + optTime + " pro_time:" + (endTimeMillis - startTimeMillis) + "ms ;"
+" param:"+ JSON.toJSON(inputParamMap)+";"+"n result:"+ JSON.toJSON(outputParamMap));
}
}
输出结果