新版SpringCloudGateway网关 切面修改方法入参

通过注解修改方法入参值,一般都是采用实现

org.springframework.web.method.support.HandlerMethodArgumentResolver 接口的
resolveArgument方法来做的

实现此接口之后,还需要另外创建一个bean来实现

WebMvcConfigurer 接口

添加参数解析器

但是由于springCloudGateway新版本 (2.2.x +)之后,似乎彻底移除除了spring-mvc系列的依赖包,导致这种切面方式不可用

(也不能手动添加spring-web....一些列的依赖到网关服务里,加上去启动报错)。

所以修改参数的切面只能使用@Aspect 注解达到切面效果

需要注意的是@Aspect注解只有@Around("pointCut()") 的方法可以改写入参,@Before以及其他几个拦截器无法返回参数

样例如下,将参数前使用@LoginUser的参数注入已经登录的相关信息。

切入点的公式可以直接复制,改下包名和自定义注解路径即可

@Aspect
@Component
public class LoginUserAspect {

    @Autowired
    private AuthFeign authFeign;

    // 配置织入点
    @Pointcut("execution(public * com.xqoo..*(.., @com.xqoo.feign.annotations.LoginUser (*), ..))")
    public void pointCut() {
    }

    @Before("pointCut()")
    public void beforeMethod(JoinPoint joinPoint) {
    }

    @Around("pointCut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        Object returnModel;
        //获取请求头
        HttpServletRequest request = ServletUtils.getRequest();
        String token = request.getHeader(SystemPublicConstant.AUTH_HEADER_KEY_NAME);
        //获取目标方法的参数信息
        Object[] obj = pjp.getArgs();
        for (int i = 0; i < obj.length; i++) {
            if (obj[i] instanceof CurrentUser) {
                if(StringUtils.isEmpty(token)){
                    obj[i] = new CurrentUser();
                    break;
                }
                obj[i] = FeignReturnDataGzip.Unzip(authFeign.getLoginUserInfo(token), CurrentUser.class);
                break;
            }
        }
        returnModel = pjp.proceed(obj);
        return returnModel;
    }

}

springCloudGateway 版本 2.2.5,springBoot版本不受影响,依然可以添加spring-web系列依赖

经验分享 程序员 微信小程序 职场和发展