Spring boot 我可以有条件地跳过SpringCloudGateway中的其他过滤器吗?
我设置了顺序为-1的GlobalFilter,以检查请求头中的jwt是否有效。 若无效,我会用标题响应,标题上写着客户端重定向到登录页面。 如果结果是无效的,则无需满足其他过滤器的要求。 我可以暂时禁用链中的其他筛选器并直接发送响应吗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
@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响应代码