Spring Boot中使用AOP统一处理Web请求日志
—————————-这里写代码片
1.Pom.xml添加spring aop的支持已紧急AspectJ依赖
org.springframework.boot
BEH-Manager
1.4.1.RELEASE
org.aspectj
aspectjweaver
org.aspectj
aspectjrt
2.编辑拦截器代码如下
package com.bonc.manager.web.modules.audit.aspect;
import com.alibaba.fastjson.JSON;
import com.bonc.manager.web.modules.audit.entity.OperatorLog;
import com.bonc.rest.Entity.user.User;
import org.apache.http.protocol.HTTP;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Arrays;
@Aspect
@Component
public class AuditLogAop {
private Logger logger = LoggerFactory.getLogger(AuditLogAop.class);
private ThreadLocal tlocal = new ThreadLocal();
/**
* 定义拦截规则:拦截com.bonc.manager.web.modules.*.controller包下面的 所有类中,有@RequestMapping注解的方法。
*/
@Pointcut(“execution(public * com.bonc.manager.web.modules..controller...*(..))”)
public void webRequestLog() {}
/**
*收到http请求之前的处理
*/
@Before(“webRequestLog()”)
public void doBefore(JoinPoint joinPoint) {
try {
long beginTime = System.currentTimeMillis();
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String beanName = joinPoint.getSignature().getDeclaringTypeName();
String methodName = joinPoint.getSignature().getName();
String uri = request.getRequestURI();
String remoteAddr = getIpAddr(request);
String sessionId = request.getSession().getId();
String user = getUserName(request);
String method = request.getMethod();
String params = "";
if ("POST".equals(method)) {
doSomeThing..
} else {
doSomeThing..
}
logger.info(“操作请求日志记录成功doBefore()“);
} catch (Exception e) {
logger.error(“操作请求日志记录失败doBefore()“, e);
}
}
/**
*收到http请求之后的返回结果的处理
*/
@AfterReturning(returning = “result”, pointcut = “webRequestLog()”)
public void doAfterReturning(Object result) {
try {
// 处理完请求,返回内容
OperatorLog optLog = tlocal.get();
if( result != null ) {
logger.debug(result.getClass().toString());
optLog.setResult(JSON.toJSONString(result));
}
String beginTime = optLog.getRequestTime();
long requestTime = (System.currentTimeMillis() - Long.parseLong(beginTime)) / 1000;
optLog.setRequestTime(requestTime + “”);
logger.debug(“optLog.result=”+optLog.getResult());
} catch (Exception e) {
logger.error(“操作请求日志记录失败doAfterReturning()“, e);
}
}
/*
* 获取登录用户远程主机ip地址
*
* @param request
* @return
/
private String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader(“x-forwarded-for”);
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = request.getHeader(“Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = request.getHeader(“WL-Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/*
* 请求参数拼装
*
* @param paramsArray
* @return
/
private String argsArrayToString(Object[] paramsArray) {
String params = “”;
if (paramsArray != null && paramsArray.length > 0) {
for (int i = 0; i < paramsArray.length; i++) {
Object jsonObj = net.sf.json.JSONObject.fromObject(paramsArray[i]);
params += jsonObj.toString() + ” “;
}
}
return params.trim();
}
}