抽象名称中的@Order值网关过滤器工厂不起作用



我有两个类:filter和获取响应体的类。据我所知,我需要指定顺序NettyWriteResponseFilter.WRITE_REPONSE_FILTER_order-1,这样过滤器就会得到响应体。

但当我实现Ordered或使用注解@Order或通过OrderedGatewayFilter时,我不能调用BodyRewrite类(它得到响应体(。当我尝试将其用于全局筛选器(已实现的GlobalFilter(时,它运行良好。

可能是因为我扩展了AbstractNameValueGatewayFilterFactory,而我无法指定它的顺序吗?

完整代码:https://github.com/artem-kurilko/NettyFilter

Jwt过滤器等级:

@Component
public class JWTFilter extends AbstractNameValueGatewayFilterFactory {
private final ModifyResponseBodyGatewayFilterFactory modifyResponseBodyGatewayFilterFactory;
private final BodyRewrite bodyRewrite;
@Autowired
public JWTFilter(ModifyResponseBodyGatewayFilterFactory modifyResponseBodyGatewayFilterFactory, BodyRewrite bodyRewrite, ErrorWebExceptionHandler errorWebExceptionHandler) {
this.modifyResponseBodyGatewayFilterFactory = modifyResponseBodyGatewayFilterFactory;
this.bodyRewrite = bodyRewrite;
}
@Override
public GatewayFilter apply(NameValueConfig config) {
System.out.println("n          JWT FILTERn");
return new OrderedGatewayFilter((exchange, chain) -> {
GatewayFilter delegate = modifyResponseBodyGatewayFilterFactory.apply(new ModifyResponseBodyGatewayFilterFactory.Config()
.setRewriteFunction(byte[].class, byte[].class, bodyRewrite));
return delegate.filter(exchange, chain).then(Mono.fromRunnable(() -> System.out.println("nPost JWTFilter executedn")));
}, NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER-1);
}
}

全局过滤器:

@Component
public class ModifyResponseBodyFilter implements GlobalFilter, Ordered {
private final ModifyResponseBodyGatewayFilterFactory modifyResponseBodyGatewayFilterFactory;
private final BodyRewrite bodyRewrite;
@Autowired
public ModifyResponseBodyFilter(ModifyResponseBodyGatewayFilterFactory modifyResponseBodyGatewayFilterFactory, BodyRewrite bodyRewrite, ErrorWebExceptionHandler errorWebExceptionHandler) {
this.modifyResponseBodyGatewayFilterFactory = modifyResponseBodyGatewayFilterFactory;
this.bodyRewrite = bodyRewrite;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
if (exchange.getRequest().getURI().getPath().equals("/key/login")) {
return exchange.getResponse().setComplete();
}
GatewayFilter delegate=modifyResponseBodyGatewayFilterFactory.apply(new ModifyResponseBodyGatewayFilterFactory.Config()
.setRewriteFunction(byte[].class, byte[].class, bodyRewrite));
return delegate.filter(exchange, chain).then(Mono.fromRunnable(() -> System.out.println("nPost GlobalFilter executedn")));
}
@Override
public int getOrder() {
return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER-1;
}
}

接收响应体的类:

@Component
class BodyRewrite implements RewriteFunction<byte[], byte[]> {
@Override
public Publisher<byte[]> apply(ServerWebExchange exchange, byte[] body) {
String originalBody = body==null?"":new String(body);
if (!ServerWebExchangeUtils.isAlreadyRouted(exchange)) {
return Mono.just(originalBody.getBytes());
} else {
System.out.println("------------------------------------");
System.out.println("got response body: " + originalBody);
System.out.println("------------------------------------");
return Mono.just(body);
}
}
}

application.yml

spring:
cloud:
gateway:
routes:
- id: global_route
uri: http://httbin.org
predicates:
- Path=/key/login
filters:
- JWTFilter=RSA512,HS512
- id: global_route
uri: http://httbin.org
predicates:
- Path=/**
filters:
- RewritePath=/service(?<segment>/?.*), ${segment}
server:
port: 8082

jwt过滤路线上的输出

Stopped global filter as it is jwt filter route
Post JWTFilter executed

全局过滤路由上的输出

got response body: Something
Post GlobalFilter executed

因此,当我尝试通过JWTFilter调用BodyRewrite时,它不起作用,但使用全局筛选器时,它可以正常工作。

首先,您应该知道GatewayFilter用于一个特殊的路由,因此您应该将其绑定到一个路由。GlobalFilter将对所有路由生效。

将网关过滤器与网关过滤器组装在一起是多余的。

最新更新