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;
}
}
只是简单的记录一下,到这里就结束了