首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以有条件地跳过Spring Cloud Gateway中的其他过滤器?

是否可以有条件地跳过Spring Cloud Gateway中的其他过滤器?
EN

Stack Overflow用户
提问于 2020-01-28 16:18:03
回答 1查看 1K关注 0票数 1

设置序号为-1的GlobalFilter,检查请求头中的jwt是否有效。如果无效,我会响应报头,告诉客户端重定向到登录页面。如果它被证明是无效的,则不需要满足其他过滤器。是否可以暂时关闭链中的其他过滤器,并直接发送响应?

代码语言:javascript
复制
@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。`

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-08 00:37:05

是的你可以。在您的示例中,您必须通过返回空Mono<Void>来中断链。它应该如下所示:

代码语言:javascript
复制
@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响应码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59944589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档