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());
}
}
}
}
浙公网安备 33010602011771号