废话
这几天换了新工作,需要重新开发一套系统,技术选用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的路由便会报错
可能会有更通用的方法,但是目前只想到这么多,以后有好的解决办法会继续更新