从零搭建开发脚手架 SpringBoot自定义注解+AOP实现用户行为监控

该专栏配套的开源项目easy-admin已开源https://gitee.com/lakernote/easy-admin

背景

系统上线之后,需要记录哪些用户,哪些IP,终端是什么,请求体,响应体,耗时等进行记录,可以用于安全防控,用户行为分析,系统优化等。

实现

1.自定义注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Metrics {

}

可自行扩展属性,例如加模块名称

2.自定义AOP拦截器

自定义AOP拦截器拦截在方法和类上注解了@Metrics的实例,进行切面操作。

@Aspect
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MetricsAspect {
    @Pointcut("@annotation(Metrics) || @within(Metrics)")
    public void withAnnotationMetrics() {
    }
    @Around("withAnnotationMetrics()")
    public Object metrics(ProceedingJoinPoint pjp) throws Throwable {
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        String name = signature.toShortString();
        Object returnValue;
        Instant start = Instant.now();
        ExtLog logBean = new ExtLog();
        logBean.setIp(HttpServletRequestUtil.getRemoteAddress());
        logBean.setUri(HttpServletRequestUtil.getRequestURI());
        logBean.setUserId(StpUtil.isLogin() ? StpUtil.getLoginIdAsLong() : null);
        logBean.setClient(HttpServletRequestUtil.getRequestUserAgent());
        logBean.setRequest(objectMapper.writeValueAsString(pjp.getArgs()));
        logBean.setMethod(name);
        logBean.setStatus(true);
        try {
            returnValue = pjp.proceed();
        } catch (Exception ex) {
            logBean.setCost((int) Duration.between(start, Instant.now()).toMillis());
            logBean.setCreateTime(LocalDateTime.now());
            logBean.setStatus(false);
            extLogService.save(logBean);
            log.error(name, ex);
            throw ex;

        }
        String response = objectMapper.writeValueAsString(returnValue);
        logBean.setCost((int) Duration.between(start, Instant.now()).toMillis());
        logBean.setCreateTime(LocalDateTime.now());
        if (StrUtil.isNotBlank(response) && response.length() <= 500) {
            logBean.setResponse(response);
        }
        extLogService.save(logBean);
        return returnValue;
    }
}

该专栏配套的开源项目easy-admin已开源https://gitee.com/lakernote/easy-admin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lakernote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值