Spring Cloud Gateway获取body内容,不影响GET请求

3 篇文章 0 订阅
2 篇文章 0 订阅

Spring Cloud Gateway获取body内容,不影响GET请求

废话

这几天换了新工作,需要重新开发一套系统,技术选用Spring Cloud。在对接终端接口的时候要做验签,就涉及到在网关做拦截器,然后取出BODY里面的数据。
网上找了几个方法,有的拿不到数据,有的拿到数据之后不支持GET请求了。没有一个合理的解决办法,最后想到在动态路由构建的时候可以指定METHOD,于是有了如下解决办法

解决

	@Bean
    public RouteLocator vmRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.method(HttpMethod.POST).and()
                        .readBody(Object.class, requestBody -> {
                            //相当于缓存了body信息,在filter 中可以这么获取 exchange.getAttribute("cachedRequestBodyObject");
                            log.info("requestBody is {}", requestBody);
                            return true;
                        })
                        .and().path("/terminal/**")
                        .filters(f -> f.filter(terminalSignFilter()))
                        .uri("lb://TERMINAL-SERVICE")
                        .order(0)
                        .id("terminal-service")
                )
                .route(r -> r.method(HttpMethod.GET).and()
                        .path("/terminal/**")
                        .filters(f -> f.filter(terminalSignFilter()))
                        .uri("lb://TERMINAL-SERVICE")
                        .order(1)
                        .id("terminal-service")
                )
                .build();
    }

关键代码:

r.method(HttpMethod.POST)
r.method(HttpMethod.GET)

分别指定了不同请求METHOD对应的路由策略
在POST请求中需要缓存BODY信息,在Filter中便可以获取到
GET请求因为没有BODY,所以如果不指定GET的路由便会报错
可能会有更通用的方法,但是目前只想到这么多,以后有好的解决办法会继续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值