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());
			}
		}
	}
}