package com.fdkankan.ucenter.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.fdkankan.ucenter.geo.IPUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

/**
 * 
 * @ClassName: ControllerAopInterceptor
 * @Description: 访问接口的参数以及返回结果的日志
 * @author B450-R5
 * @date 2018年11月23日
 *
 */
@Component // 将对象交由spring进行管理
@Aspect // 代表此类为一个切面类
public class ControllerAopInterceptor {
	/** 初始化日志打印 */
	public static final Logger log = LoggerFactory.getLogger("visitLog");

	// 切入点表达式
	@Pointcut("execution(public * com.fdkankan.ucenter.controller..*Controller.*(..))")
	public void privilege() {
	}

	@Around("privilege()")
	public Object around(ProceedingJoinPoint pjp) throws Throwable {

		// 获取类名
		String className = pjp.getTarget().getClass().getName();// pjp.getTarget().getClass().getSimpleName();
		// 获取执行的方法名称
		String methodName = pjp.getSignature().getName();
		// 获取参数名称
		String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
		// 定义返回参数
		Object result = null;
		// 获取方法参数
		Object[] args = pjp.getArgs();
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
		// 请求的URL
		String requestURL = request.getRequestURL().toString();
		String ip = IPUtils.getIpAddr(request);

		StringBuilder paramsBuf = new StringBuilder();
		// 获取请求参数集合并进行遍历拼接
		for (int i = 0; i < args.length; i++) {
			if (paramsBuf.length() > 0) {
				paramsBuf.append("|");
			}
			paramsBuf.append(parameterNamesArgs[i]).append(" = ").append(args[i]);
		}

		// 打印请求参数参数
		// 记录开始时间
		long start = System.currentTimeMillis();

		log.warn("请求| ip:{} , 请求接口:{} ,请求时间:{}, 参数:{} , 请求token:{} ",
				ip, requestURL, start,paramsBuf.toString(), request.getHeader("token"));
		// 执行目标方法
		result = pjp.proceed();
		// 获取执行完的时间 打印返回报文
		log.warn("返回| 请求接口:{} , 请求时间:{} , 处理时间:{} 毫秒 , 返回结果 :{}",
				requestURL, start, (System.currentTimeMillis() - start), result);
		return result;
	}

}

