切面配置
/**
* 定义pilecontroller下的所有方法为切入点
*/
@Pointcut("execution(* com.project.controller.*.*(..))")
public void AccessPointcut(){}
@Around("AccessPointcut()")
public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String ipAddr = getRemoteHost(request);
String url = request.getRequestURL().toString();
String uri = request.getRequestURI();
String reqParam = preHandle(joinPoint,request);
log.info("请求源IP:【{}】,请求URL:【{}】,请求参数:【{}】",ipAddr,url,reqParam);
Object result= joinPoint.proceed();
String respParam = postHandle(result);
log.info("请求源IP:【{}】,请求URL:【{}】,返回参数:【{}】",ipAddr,url,respParam);
return result;
}
/**
* 入参数据
* @param joinPoint
* @param request
* @return
*/
private String preHandle(ProceedingJoinPoint joinPoint,HttpServletRequest request) {
String reqParam = "";
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method targetMethod = methodSignature.getMethod();
Annotation[] annotations = targetMethod.getAnnotations();
//获取请求参数方法一
for (Annotation annotation : annotations) {
//此处可以改成自定义的注解
if (annotation.annotationType().equals(PostMapping.class)) {
reqParam = JSON.toJSONString(request.getParameterMap());
break;
}
}
//获取请求参数方法二
if (joinPoint.getArgs().length > 0) {
for (Object o : joinPoint.getArgs()) {
if (o instanceof HttpServletRequest || o instanceof HttpServletResponse) {
continue;
}
reqParam+=JSON.toJSONString(o);
}
}
return reqParam;
}
/**
* 返回数据
* @param retVal
* @return
*/
private String postHandle(Object retVal) {
if(null == retVal){
return "";
}
return JSON.toJSONString(retVal);
}
/**
* 获取目标主机的ip
* @param request
* @return
*/
private String getRemoteHost(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 "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}