InnerVisitLogInterceptor.java 3.5 KB

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