java通过AOP修改请求中的参数值
1、背景
项目中存在一个需求,当用户不传项目ID时,将其赋值为默认值,初步分析后,发现接口数量众多,且绝大多数接口都需要传递项目ID。Controller接口的参数形式很多,大多数的Post请求都是以对象的方式接收参数,部分Post的form-data请求和Get请求是以多个基本数据类型的方式接收参数,一般这种多接口的公共处理,都是采用AOP的方式处理,所以此处也采用相同的方式。
2、切面中排除部分接口
@Aspect @Component @Order(-99) public class SdkDefaultProjectAspect{ @Pointcut("execution( public * com.test.controller.client.*Controller.*( .. ))") public void openApiController(){ } @Around("!openApiController() && execution(public * com.test..*Controller.*( .. ))") public Object dealSdkProjectId(ProceedingJoinPoint joinPoint){ joinPoint.proceed(); } }
@Pointcut表示匹配com.test.controller.client包路径下,所有以Controller结尾的接口
@Around 表示匹配com.test包路径下,所有的以Controller结尾的接口,并排除了上面@Pointcut匹配的接口
@Order用来控制切面执行的顺序,数字越小,越早执行
3、修改请求参数的值
@Aspect @Component @Order(-99) public class SdkDefaultProjectAspect{ @Pointcut("execution( public * com.test.controller.client.*Controller.*( .. ))") public void openApiController(){ } @Around("!openApiController() && execution(public * com.test..*Controller.*( .. ))") public Object dealSdkProjectId(ProceedingJoinPoint joinPoint){ //获取方法签名 MethodSignature ms = (MethodSignature)joinPoint.getSignature(); Class<?> targetCls = joinPoint.getTarget().getClass(); Method method = targetCls.getDeclaredMethod(ms.getName(),ms.getParameterTypes()); //获取指定方法的参数名 ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer(); String[] parameterNames = pnd.getParameterNames(method); //循环判断处理方法参数 Object[] args = joinPoint.getArgs(); for(int i = 0;i<args.length;i++){ String parameterName = parameterNames[i]; Object target = args[i]; if("projectId".equals(parameterName)){ args[i] = DEFAULT_PROJEECT; break; }else if(target instanceof BaseAuthDTO && ((BaseAuthDTO)target).getProjectId == null){ (BaseAuthDTO)target).setProjectId(DEFAULT_PROJEECT); break; } } joinPoint.proceed(args); } }
1、ParameterNameDiscoverer用于获取方法参数的名称,例如方法为void test(String name,Integer age);
,则返回["name","age"]的数组。
2、要使修改的参数值生效,需要使用joinPoint.proceed(Object[] args);
将修改的参数传递进去,否则无法修改。如下图,joinPoint.proceed()
有两个重载的方法,方法带入参的才能修改参数值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」