package com.sleep.demo.intercepter; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @Slf4j @Aspect @Component public class ControllerLogAspect { @Pointcut("execution(* com.sleep.demo.controller..*.*(..))") public void pointCut() { } @Around(value = "pointCut()") public Object doAuthMethodInterrupt(ProceedingJoinPoint point) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); String methodName = point.getSignature().getName(); // 入参 Object[] paramArr = point.getArgs(); //序列化时过滤掉request和response List<Object> logArgs = streamOf(paramArr) .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse ))) .collect(Collectors.toList()); // 入参打印 log.info(">>>>>>>>>>>> Method:{} , path={} ,Param:{}" , methodName, request.getRequestURI(), JSONObject.toJSONString(logArgs)); try { long currentTimeStampBegin = System.currentTimeMillis(); Object obj = point.proceed(); long diff = System.currentTimeMillis() - currentTimeStampBegin; // 出参打印 log.info("<<<<<<<<<<<< method:{} , Response:{} ,time:{}ms", methodName, JSONObject.toJSONString(obj), diff); return obj; } catch (Throwable e) { log.error("<<<<<<<<<<<< method:{},REQUEST_ERROR_MSG:{}", methodName, e.getMessage()); // throw new RuntimeException(e); e.printStackTrace(); return 500; } } public static <T> Stream<T> streamOf(T[] array) { return ArrayUtils.isEmpty(array) ? Stream.empty() : Arrays.stream(array); } }
需要有spring aop的支持
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
其他例子,aop获取方法入参
package com.jd.rcloud.decorate.aop; import com.jd.rcloud.common.util.JsonUtils; import com.jd.rcloud.decorate.login.base.service.LoginContextService; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.jd.am.util.UtilString; import com.jd.rcloud.common.ann.ReqParamAssembler; import com.jd.rcloud.decorate.util.AdminRequestContextHelper; import com.jd.rcloud.decorate.admin.domain.param.req.AdminBaseReqParam; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Method; /** * 控制层层主切面类 * * @author lidalin7 * */ @Slf4j @Setter @Getter @Aspect @Component public class AdminControllerAop { @Autowired private LoginContextService loginContextService; @Pointcut("execution(* com.jd.rcloud.decorate.*.web..*Controller.*(..))") public static void doPointcut() { System.out.println("这个方法不会被执行,它只是负责描述切入点"); } @Before("doPointcut() && @annotation(reqParamAssembler)") public void doBefore(JoinPoint joinPoint, ReqParamAssembler reqParamAssembler) { // 开始执行所有请求的DoBefore if (joinPoint == null) { return; } MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); if (methodSignature == null) { return; } Method method = methodSignature.getMethod(); if (method == null) { return; } // 参数集合 Object[] objs = joinPoint.getArgs(); for (Object obj : objs) { // 若非商家端基础请求参数的实例->继续 if (obj instanceof AdminBaseReqParam) { AdminBaseReqParam adminBaseReqParam = (AdminBaseReqParam) obj; // 优先接受前端的入参, if (UtilString.isBlank(adminBaseReqParam.getTenantCode())) { adminBaseReqParam.setTenantCode(AdminRequestContextHelper.getTenantCode());// 租户编码 } if (adminBaseReqParam.getBusinessType() == null) { adminBaseReqParam.setBusinessType(AdminRequestContextHelper.getBusinessType());// 租户编码 } if (adminBaseReqParam.getSystemType() == null) { adminBaseReqParam.setSystemType(AdminRequestContextHelper.getSystemType());// 租户编码 } adminBaseReqParam.setUserPin(this.loginContextService.getPin());// 用户Pin adminBaseReqParam.setCreator(this.loginContextService.getPin());// 创建者 adminBaseReqParam.setOperator(this.loginContextService.getPin());// 操作者 } if(log.isInfoEnabled()){ log.info("[{}][部分设置]设置请求参数的核心属性为:", method.getName(), obj.toString()); } } } }