统计接口信息

该博客介绍在Spring Boot项目中配置AOP切面来统计用户请求接口信息。因项目需统计用户操作记录,博主查阅资料并结合实际情况进行配置,新建类管理AOP切面,最后简单记录完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot项目中配置aop切面来统计用户请求接口信息

最近项目需要统计来自用户操作的一些记录,从网上查阅了一些资料然后结合自己项目的实际情况配置了一下,在这里记录下来

新建一个类来管理aop切面

package com.goobird.hivideo.security.bean;

import com.alibaba.fastjson.JSONObject;
import com.goobird.common.bean.CommonStaticValueHelp;
import com.goobird.common.util.StringHelp;
import com.goobird.common.util.UserDetailsHelp;
import com.goobird.hivideo.backstage.dao.BackstageInterfaceDao;
import com.goobird.hivideo.backstage.dao.BackstageSiteSetupDao;
import com.goobird.hivideo.backstage.pojo.BackstageTask;
import com.goobird.hivideo.backstage.pojo.BackstageTaskDetail;
import com.goobird.hivideo.user.dao.UserLoginDao;
import com.goobird.hivideo.user.pojo.UserLogin;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Map;
import java.util.Set;

@Aspect
@Component
public class MethodExecuteTimeViewer {

    public static final String POINT = "execution (* com.goobird.hivideo.backstage.controller.*.*(..))";		//配置切面的拦截  指定了具体包下面的类
    private static Log logger = LogFactory.getLog(MethodExecuteTimeViewer.class);		//打印日志

    @Resource
    private BackstageSiteSetupDao backstageSiteSetupDao;		//项目中的接口层
    @Resource
    private BackstageInterfaceDao backstageInterfaceDao;		 //项目中的接口层          
    @Resource
    private UserLoginDao userLoginDao;		//项目中的接口层
    @Resource
    private HttpServletRequest httpServletRequest;		//这里把httpServletRequest对象放进来,用来获取请求方法

    @Around(POINT)
    public Object timeAround(ProceedingJoinPoint joinPoint) {
        Object obj = null;
        String requestType = httpServletRequest.getMethod();
        if (!"GET".equalsIgnoreCase(requestType)) {		//对Post、Put、Delete请求进行管理
            BackstageTask backstageTask = new BackstageTask();
            UserDetails userDetail = UserDetailsHelp.getUserDetail();
            if (userDetail != null && userDetail.getUsername() != null) {
                UserLogin userLogin =  new UserLogin();
                userLogin.setUserName(userDetail.getUsername());
                UserLogin user = userLoginDao.get(userLogin);
                if (user != null && user.getId() != null) {
                    backstageTask.setUserId(user.getId());
                }
            }
            backstageTask.setCreateTime(new Date());		//记录接口请求开始时间
            Map<String, String[]> parameterMap = httpServletRequest.getParameterMap();
            if (parameterMap != null) {
                String params = "";
                Set<String> keySet = parameterMap.keySet();
                for (String key : keySet) {
                    params = params + key + ":" + StringUtils.join(parameterMap.get(key)) + ";  ";
                }
                backstageTask.setTarget(params);		//将请求参数保存起来
            }
            String taskName = backstageInterfaceDao.getInterfaceByUrlAndRequestModel(requestType, httpServletRequest.getRequestURI().replace(CommonStaticValueHelp.BACKSTAGE_REQUEST_TOP, ""));		//获取到请求接口对应的名称
            if (StringHelp.isNotEmpty(taskName)) {
                backstageTask.setTask(taskName);
            }
            backstageSiteSetupDao.insertTask(backstageTask);
            Object[] args = joinPoint.getArgs();
            Long startTime = System.currentTimeMillis();
            Long endTime = null;
            try {
                obj = joinPoint.proceed(args);		//这里是获取请求方法返回的结果
                JSONObject jsonObject = (JSONObject) obj;
                if ("500".equals(jsonObject.getString("CODE"))) {
                    BackstageTaskDetail backstageTaskDetail = new BackstageTaskDetail();
                    backstageTaskDetail.setDetail(jsonObject.getString("CODE").toString());
                    backstageSiteSetupDao.insertTaskDetail(backstageTaskDetail);
                    backstageTask.setDetails(backstageTaskDetail.getId());
                    endTime = System.currentTimeMillis();		//获取接口异常报错时间
                    backstageTask.setStatus(CommonStaticValueHelp.TASK_EXECPTION);
                }
                endTime = System.currentTimeMillis();		//获取接口正常结束时间
                backstageTask.setStatus(CommonStaticValueHelp.TASK_COMPLETE);
            } catch (Throwable throwable) {
                logger.info("执行错误", throwable);
            } finally {
                backstageTask.setSpendTime(endTime - startTime);			//通过计算来得出接口的耗时
                backstageSiteSetupDao.updateTask(backstageTask);
            }
        } else {		//如果是Get请求,不作处理 
            Object[] args = joinPoint.getArgs();
            try {
                obj = joinPoint.proceed(args);
            } catch (Throwable throwable) {
                logger.info("执行错误", throwable);
            }
        }
        return obj;
    }
}

只是简单的记录一下,到这里就结束了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值