Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 我可以有条件地跳过SpringCloudGateway中的其他过滤器吗?_Spring Boot_Spring Cloud Gateway_Spring Filter - Fatal编程技术网

Spring boot 我可以有条件地跳过SpringCloudGateway中的其他过滤器吗?

Spring boot 我可以有条件地跳过SpringCloudGateway中的其他过滤器吗?,spring-boot,spring-cloud-gateway,spring-filter,Spring Boot,Spring Cloud Gateway,Spring Filter,我设置了顺序为-1的GlobalFilter,以检查请求头中的jwt是否有效。 若无效,我会用标题响应,标题上写着客户端重定向到登录页面。 如果结果是无效的,则无需满足其他过滤器的要求。 我可以暂时禁用链中的其他筛选器并直接发送响应吗 @Order(-1) @Component public class JwtRequestFilter implements GlobalFilter { @Override public Mono<Void> filter(Serv

我设置了顺序为-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);
    }

}

订单(-1) @组成部分 公共类JwtRequestFilter实现了GlobalFilter{ @凌驾 公共Mono筛选器(服务器WebExchange exchange、网关筛选器链){ 试一试{ 字符串令牌=exchange.getRequest().getHeaders().get(“授权”).get(0)子字符串(7); }捕获(NullPointerException e){ logger.warn(“无令牌”); //exchange.getResponse().setStatusCode(HttpStatus.valueOf(401)); exchange.getResponse().getHeaders().set(“status”,“401”); logger.info(“状态代码:+exchange.getResponse().getStatusCode()); } 返回链。过滤器(交换); } } 此外,我发现
exchange.getResponse().setStatusCode(HttpStatus.valueOf(401))不起作用,但
exchange.getResponse().getHeaders().set(“status”,“401”)工作。为什么不使用
setStatusCode
更改它?当我在设置状态代码后立即登录时,我从这两个代码中得到了401,但是使用curl我总是得到了200。
`是的,你可以。在您的示例中,必须通过返回空的
Mono
来断开链。它应该如下所示:

订单(-1) @组成部分 公共类JwtRequestFilter实现了GlobalFilter{ @凌驾 公共Mono筛选器(服务器WebExchange exchange、网关筛选器链){ 试一试{ 字符串令牌=exchange.getRequest().getHeaders().get(“授权”).get(0)子字符串(7); }捕获(NullPointerException e){ logger.warn(“无令牌”); //exchange.getResponse().setStatusCode(HttpStatus.valueOf(401)); exchange.getResponse().getHeaders().set(“status”,“401”); logger.info(“状态代码:+exchange.getResponse().getStatusCode()); 返回Mono.empty(); } 返回链。过滤器(交换); } }
若你们不这样做,那个么链将被进一步执行,而不考虑你们的逻辑。当您的请求被正确路由到返回典型响应的目标服务时,您会看到200个状态响应。更多的响应标题被netty覆盖。因此,您无法看到401响应代码