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

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的路由便会报错
可能会有更通用的方法,但是目前只想到这么多,以后有好的解决办法会继续更新

你可能感兴趣的:(SPRING,SPRING,CLOUD,后端)