ControllerAopInterceptor.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package com.fdkankan.ucenter.interceptor;
  2. import com.alibaba.fastjson.JSONObject;
  3. import org.aspectj.lang.ProceedingJoinPoint;
  4. import org.aspectj.lang.annotation.Around;
  5. import org.aspectj.lang.annotation.Aspect;
  6. import org.aspectj.lang.annotation.Pointcut;
  7. import org.aspectj.lang.reflect.MethodSignature;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.web.context.request.RequestContextHolder;
  12. import org.springframework.web.context.request.ServletRequestAttributes;
  13. import javax.servlet.http.HttpServletRequest;
  14. import java.util.Enumeration;
  15. /**
  16. *
  17. * @ClassName: ControllerAopInterceptor
  18. * @Description: 访问接口的参数以及返回结果的日志
  19. * @author B450-R5
  20. * @date 2018年11月23日
  21. *
  22. */
  23. @Component // 将对象交由spring进行管理
  24. @Aspect // 代表此类为一个切面类
  25. public class ControllerAopInterceptor {
  26. /** 初始化日志打印 */
  27. public static final Logger log = LoggerFactory.getLogger("visitLog");
  28. // 切入点表达式
  29. @Pointcut("execution(public * com.fdkankan.ucenter.controller..*Controller.*(..))")
  30. public void privilege() {
  31. }
  32. @Around("privilege()")
  33. public Object around(ProceedingJoinPoint pjp) throws Throwable {
  34. // 获取类名
  35. String className = pjp.getTarget().getClass().getName();// pjp.getTarget().getClass().getSimpleName();
  36. // 获取执行的方法名称
  37. String methodName = pjp.getSignature().getName();
  38. // 获取参数名称
  39. String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
  40. // 定义返回参数
  41. Object result = null;
  42. // 获取方法参数
  43. Object[] args = pjp.getArgs();
  44. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  45. // 请求的URL
  46. String requestURL = request.getRequestURL().toString();
  47. String ip = getIpAddr(request);
  48. StringBuilder paramsBuf = new StringBuilder();
  49. // 获取请求参数集合并进行遍历拼接
  50. for (int i = 0; i < args.length; i++) {
  51. if (paramsBuf.length() > 0) {
  52. paramsBuf.append("|");
  53. }
  54. paramsBuf.append(parameterNamesArgs[i]).append(" = ").append(args[i]);
  55. }
  56. // 打印请求参数参数
  57. // 记录开始时间
  58. long start = System.currentTimeMillis();
  59. log.info("请求| ip:{} , 请求接口:{} ,请求时间:{}, 参数:{} , 请求token:{} ",
  60. ip, requestURL, start,paramsBuf.toString(), request.getHeader("token"));
  61. // 执行目标方法
  62. result = pjp.proceed();
  63. // 获取执行完的时间 打印返回报文
  64. log.info("返回| 请求接口:{} , 请求时间:{} , 处理时间:{} 毫秒 , 返回结果 :{}",
  65. requestURL, start, (System.currentTimeMillis() - start), result);
  66. return result;
  67. }
  68. /**
  69. * @Title: getIpAddr
  70. * @Description: 获取ip
  71. * @param request
  72. * @return
  73. * @return String 返回类型
  74. */
  75. public String getIpAddr(HttpServletRequest request) {
  76. String ipAddress = null;
  77. ipAddress = request.getHeader("x-forwarded-for");
  78. if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  79. ipAddress = request.getHeader("Proxy-Client-IP");
  80. }
  81. if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  82. ipAddress = request.getHeader("WL-Proxy-Client-IP");
  83. }
  84. if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  85. ipAddress = request.getRemoteAddr();
  86. }
  87. // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
  88. if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
  89. // = 15
  90. if (ipAddress.indexOf(",") > 0) {
  91. ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
  92. }
  93. }
  94. // 或者这样也行,对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
  95. //return ipAddress!=null&&!"".equals(ipAddress)?ipAddress.split(",")[0]:null;
  96. return ipAddress;
  97. }
  98. }