新版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系列依赖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值