设置序号为-1的GlobalFilter,检查请求头中的jwt是否有效。如果无效,我会响应报头,告诉客户端重定向到登录页面。如果它被证明是无效的,则不需要满足其他过滤器。是否可以暂时关闭链中的其他过滤器,并直接发送响应?
@Order(-1)
@Component
public class JwtRequestFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
try {
String token = exchange.getRequest().getHeaders().get("Authorization").get(0).substring(7);
} catch (NullPointerException e) {
logger.warn("no token.");
//exchange.getResponse().setStatusCode(HttpStatus.valueOf(401));
exchange.getResponse().getHeaders().set("status", "401");
logger.info("status code :" + exchange.getResponse().getStatusCode());
}
return chain.filter(exchange);
}
}此外,我发现exchange.getResponse().setStatusCode(HttpStatus.valueOf(401));不起作用,但exchange.getResponse().getHeaders().set("status", "401");起作用。为什么不使用setStatusCode进行更改?当我在设置状态码后立即登录时,我从这两个代码中获得了401,但使用curl时,我总是得到200。`
发布于 2020-11-08 00:37:05
是的你可以。在您的示例中,您必须通过返回空Mono<Void>来中断链。它应该如下所示:
@Order(-1)
@Component
public class JwtRequestFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
try {
String token = exchange.getRequest().getHeaders().get("Authorization").get(0).substring(7);
} catch (NullPointerException e) {
logger.warn("no token.");
//exchange.getResponse().setStatusCode(HttpStatus.valueOf(401));
exchange.getResponse().getHeaders().set("status", "401");
logger.info("status code :" + exchange.getResponse().getStatusCode());
return Mono.empty();
}
return chain.filter(exchange);
}
}如果你不这样做,那么chain就会被进一步执行,而不需要关心你的逻辑。当您的请求被正确路由到返回典型响应的目标服务时,您会看到200个状态响应。更多的是你的响应头被netty覆盖了。因此,您看不到401响应码。
https://stackoverflow.com/questions/59944589
复制相似问题