package org.hsweb.web.core.logger;
import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.hsweb.commons.DateTimeUtils;
import org.hsweb.web.bean.po.logger.LoggerInfo;
import org.hsweb.web.core.logger.annotation.AccessLogger;
import org.hsweb.web.core.utils.AopUtils;
import org.hsweb.web.core.utils.WebUtil;
import org.hsweb.commons.ClassUtils;
import org.hsweb.commons.MD5;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by zhouhao on 16-4-28.
*/
public class AopAccessLoggerResolver {
public LoggerInfo resolver(ProceedingJoinPoint pjp) {
LoggerInfo logInfo = new LoggerInfo();
HttpServletRequest request = WebUtil.getHttpServletRequest();
Class<?> target = pjp.getTarget().getClass();
StringBuilder describe = new StringBuilder();
MethodSignature methodSignature = ((MethodSignature) pjp.getSignature());
Method method = methodSignature.getMethod();
String methodName = AopUtils.getMethodName(pjp);
AccessLogger classAnnotation = ClassUtils.getAnnotation(target, AccessLogger.class);
AccessLogger methodAnnotation = ClassUtils.getAnnotation(method, AccessLogger.class);
if (classAnnotation != null) {
describe.append(classAnnotation.value());
}
if (methodAnnotation != null) {
if (classAnnotation != null)
describe.append("-");
describe.append(methodAnnotation.value());
}
Map<String, Object> param = new LinkedHashMap<>();
String[] paramNames = methodSignature.getParameterNames();
Object[] args = pjp.getArgs();
for (int i = 0; i < paramNames.length; i++) {
Object arg = args[i];
String argString;
if (arg instanceof HttpServletRequest
|| arg instanceof HttpSession
|| arg instanceof HttpServletResponse
|| arg instanceof MultipartFile
|| arg instanceof MultipartFile[]) continue;
if (arg instanceof String) argString = (String) arg;
else if (arg instanceof Number) argString = String.valueOf(arg);
else if (arg instanceof Date) argString = DateTimeUtils.format(((Date) arg), DateTimeUtils.YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
else {
try {
argString = JSON.toJSONString(arg);
} catch (Exception e) {
continue;
}
}
param.put(paramNames[i], argString);
}
Map<String, String> header = WebUtil.getHeaders(request);
logInfo.setId(MD5.encode(String.valueOf(System.nanoTime())));
logInfo.setModuleDesc(describe.toString());//方法描述
logInfo.setClassName(target.getName());//当前访问映射到的类名
logInfo.setClientIp(WebUtil.getIpAddr(request));//ip地址
logInfo.setRequestMethod(request.getMethod().concat(".").concat(methodName));//方法:GET.select()
logInfo.setRequestHeader(JSON.toJSONString(header));//http请求头
logInfo.setReferer(header.get("Referer"));//referer
logInfo.setRequestUri(request.getRequestURI());//请求相对路径
logInfo.setRequestUrl(WebUtil.getBasePath(request).concat(logInfo.getRequestUri().substring(1)));//请求绝对路径
logInfo.setUserAgent(header.get("User-Agent"));//客户端标识
logInfo.setRequestParam(JSON.toJSONString(param));//请求参数
return logInfo;
}
}