1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <br> 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的支持
1 2 3 4 | <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> |
其他例子,aop获取方法入参
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | 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()); } } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗