spring-webflux - 直接从 Spring Gateway 发送来自预过滤器的错误响应
问题描述
我正在将 Spring Gateway 与 Spring WebFlux 应用程序一起使用。417
在我的情况下,如果在下游调用任何服务之前不满足某些条件,我需要返回 HTTP错误。由于某种原因,它没有返回错误;实际上它没有返回任何东西..请求只是挂起。这是我的代码。
@Component
public class GlobalGatewayPreFilter extends AbstractGatewayFilterFactory<GlobalGatewayPreFilter.Config> {
public GlobalGatewayPreFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> exchange
.getPrincipal()
.filter(principal -> principal instanceof UserAuthenticationToken)
.cast(UserAuthenticationToken.class)
.filter(token -> (token.getUser().isVerified()))
.defaultIfEmpty(setErrorResponse(exchange)).flatMap(chain::filter);
}
private ServerWebExchange setErrorResponse(ServerWebExchange exchange) {
exchange.getResponse().setStatusCode(HttpStatus.EXPECTATION_FAILED);
exchange.getResponse().setComplete();
return exchange;
}
public static class Config {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
}
有没有什么办法解决这一问题?
解决方案
好的,我能够通过使用以下方法来解决这个问题。我在这里发帖,希望有些人会从中受益。
@Component
public class GlobalGatewayPreFilter extends AbstractGatewayFilterFactory<GlobalGatewayPreFilter.Config> {
public GlobalGatewayPreFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> exchange
.getPrincipal()
.filter(principal -> principal instanceof UserAuthenticationToken)
.cast(UserAuthenticationToken.class)
.filter(token -> (token.getUser().isVerified()))
.switchIfEmpty(Mono.defer(() -> setErrorResponse(exchange.getResponse()).setComplete().then(Mono.empty())))
.flatMap(chain::filter);
}
private ServerHttpResponse setErrorResponse(ServerHttpResponse serverHttpResponse) {
serverHttpResponse.setStatusCode(HttpStatus.EXPECTATION_FAILED);
return serverHttpResponse;
}
public static class Config {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
}
推荐阅读
- java - Elastic APM Java - 记录事务和跨度,但不报告给 Elastic APM 服务器或 Kibana
- mongodb - MongoDB 将文档与嵌套数组中的元素匹配
- python - 混合 mxnet.np.concatenate
- java - 在spring boot中连接mongoDB会报错
- ios - iPhone 11 Pro 上的超广角摄像头问题
- java - 使用 Java 在 FTP 服务器中解压缩文件
- python - 如何检测浮点音频文件
- jasper-reports - 日期格式 MM/dd/yyyy 返回单个数字月/日
- reactjs - 如何在yup中编写条件要求
- .net - Windows 7 有没有办法支持 TLS 1.3 (.NET 4.8)