springboot+自定义注解+AOP

1、自定义注解名称

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {

   String value() default "";
}

2、配置切面

@Aspect
@Component
public class SysLogAspect {
   
   @Autowired
   private SysLogManager sysLogManager;
   
   @Pointcut("@annotation(com.sairobo.heart.common.annotation.SysLog)")
   public void logPointCut() { 
      
   }

   @Around("logPointCut()")
   public Object around(ProceedingJoinPoint point) throws Throwable {
      long beginTime = System.currentTimeMillis();
      //执行方法
      Object result = point.proceed();
      //执行时长(毫秒)
      long time = System.currentTimeMillis() - beginTime;
      //保存日志
      saveSysLog(point, time);
      return result;
   }

   private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
      MethodSignature signature = (MethodSignature) joinPoint.getSignature();
      Method method = signature.getMethod();
      SysLogEntity sysLog = new SysLogEntity();
      SysLog syslog = method.getAnnotation(SysLog.class);
      if(syslog != null){
         //注解上的描述
         sysLog.setOperation(syslog.value());
      }
      //请求的方法名
      String className = joinPoint.getTarget().getClass().getName();
      String methodName = signature.getName();
      sysLog.setMethod(className + "." + methodName + "()");
      //请求的参数
      Object[] args = joinPoint.getArgs();
      try{
         String params = JSONUtils.beanToJson(args[0]);
         sysLog.setParams(params);
      }catch (Exception e){

      }
      //获取request
      HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
      //设置IP地址
      sysLog.setIp(IPUtils.getIpAddr(request));
      //用户名
      SysUserEntity currUser = ShiroUtils.getUserEntity();
      if(CommonUtils.isNullOrEmpty(currUser)) {
         if(CommonUtils.isNullOrEmpty(sysLog.getParams())) {
            sysLog.setUserId(-1L);
            sysLog.setUsername(sysLog.getParams());
         } else {
            sysLog.setUserId(-1L);
            sysLog.setUsername("获取用户信息为空");
         }
      } else {
         sysLog.setUserId(ShiroUtils.getUserId());
         sysLog.setUsername(ShiroUtils.getUserEntity().getUsername());
      }
      sysLog.setTime(time);
      //保存系统日志
      sysLogManager.saveLog(sysLog);
   }

3、http上下文(HttpContextUtils)

public class HttpContextUtils {

   public static HttpServletRequest getHttpServletRequest() {
      return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
   }
}

4、IP地址

public class IPUtils {

   private static Logger logger = LoggerFactory.getLogger(IPUtils.class);

   /**
    * 获取IP地址
    * 
    * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
    * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
    */
   public static String getIpAddr(HttpServletRequest request) {
      String ip = null;
      try {
         ip = request.getHeader("x-forwarded-for");
         if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
         }
         if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
         }
         if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
         }
         if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
         }
         if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
         }
      } catch (Exception e) {
         logger.error("IPUtils ERROR ", e);
      }

      // 使用代理,则获取第一个IP地址
      if (StringUtils.isEmpty(ip) && ip.length() > 15) {
         if (ip.indexOf(",") > 0) {
            ip = ip.substring(0, ip.indexOf(","));
         }
      }

      return ip;
   }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值