Java —— 基于注解的AOP切面实现 接口调用记录

一、预期效果

对所有@RequestMapping注解的接口全部记录接口调用情况并记入日志。

二、实现代码

tips: 这里使用了Lombok的@Slf4j实现日志

@Aspect
@Component
@Slf4j
public class ReportApiCallTimesAspect {
	 /*调用次数记录前缀,方便根据前缀获取所有接口的数据*/
	public static final String WEB_API_CALL_COUNT = "web_api_call_count";
    /*时间格式*/
    private static String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
 
    @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void reportCallTimes(){
    }
 
    @Before(value = "reportCallTimes()")
    public void before(JoinPoint joinPoint){
        try {
            // 获取类名及方法名,拼接为 类名.方法名, 其中类名不包含所在包
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            String className = signature.getDeclaringType().getSimpleName();
            Method method = signature.getMethod();
            RequestMapping annotation = method.getAnnotation(RequestMapping.class);
            String apiUrl = "";
            String httpMethod = "";
            if (annotation != null){
                apiUrl = ArrayUtils.isNotEmpty(annotation.value()) ? annotation.value()[0] : "";
                httpMethod = ArrayUtils.isNotEmpty(annotation.method()) ? annotation.method()[0].name() : "";
            }
            // 记录格式, web_api_call_count_类名_请求地址_请求方法 , url地址和请求方法可以为空,即空字符串,添加固定前缀
            log.info(this.WEB_API_CALL_COUNT + "_" + className + "_" + apiUrl + "_" + httpMethod);
        }catch (Exception e){
            log.error("ReportApiCallTimesAspect,@Before error.");
        }finally {
            recordInfo2Log();
        }
    }
 
    private void recordInfo2Log(){
        // 获取请求
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        // 获取 URL
        String url = request.getRequestURL().toString();
        // 请求方法
        String method = request.getMethod();
        // 获取调用者IP
        String ip = IpUtil.getClientRealIP(request);
        // 获取调用时间
        String date = DateFormatUtils.format(new Date(),TIME_FORMAT);
        log.info("接口请求:" + url + ",请求方法:" + method + ",调用者IP:" + ip + ",请求时间:" +  date);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值