Java 我无法根据来自下游的响应头更改全局过滤器中的SpringCloudGate方式响应?
我的目标是通过使用ServerHttpResponseDecorator从下游服务器响应头接收一些令牌,如果没有这个,我无法在GlobalFilter中获取响应头。基于令牌,我计划通过引发自定义异常并在ErrorWebExceptionHandler中处理来更改下游响应 问题是,一旦我从下游服务读取了响应头,即使异常也无法停止流,我将获得来自下游服务的原始响应,但如果我在读取头之前引发异常,它将按预期工作 全局过滤器示例代码Java 我无法根据来自下游的响应头更改全局过滤器中的SpringCloudGate方式响应?,java,spring-cloud,Java,Spring Cloud,我的目标是通过使用ServerHttpResponseDecorator从下游服务器响应头接收一些令牌,如果没有这个,我无法在GlobalFilter中获取响应头。基于令牌,我计划通过引发自定义异常并在ErrorWebExceptionHandler中处理来更改下游响应 问题是,一旦我从下游服务读取了响应头,即使异常也无法停止流,我将获得来自下游服务的原始响应,但如果我在读取头之前引发异常,它将按预期工作 全局过滤器示例代码 @Component public class Cust
@Component
public class CustomFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
return -2;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpResponse originalResponse = exchange.getResponse();
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public HttpHeaders getHeaders() {
String tokenFromHeader = super.getHeaders().getFirst("TOKEN");
String regIdFromHeader = super.getHeaders().getFirst("regId");
if (false) { // if (true) { It is hadled by exception handler as expected
// I have some Buginese logic here
throw new RuntimeException();
}
if (tokenFromHeader != null && regIdFromHeader != null) {
if (true) {
//I have some Buginese logic here
// No use I am getting original response from down streams
throw new RuntimeException();
}
}
return getDelegate().getHeaders();
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
}
@组成部分
公共类CustomFilter实现GlobalFilter,已订购{
@凌驾
public int getOrder(){
返回-2;
}
@凌驾
公共Mono筛选器(服务器WebExchange exchange、网关筛选器链){
ServerHttpResponse originalResponse=exchange.getResponse();
ServerHttpResponseDecorator decoratedResponse=新的ServerHttpResponseDecorator(原始响应){
@凌驾
公共HttpHeaders getHeaders(){
字符串tokenFromHeader=super.getHeaders().getFirst(“令牌”);
字符串regIdFromHeader=super.getHeaders().getFirst(“regId”);
if(false){//if(true){异常处理程序按预期对其进行了隐藏
//我这里有一些中国逻辑
抛出新的RuntimeException();
}
if(tokenFromHeader!=null&®IdFromHeader!=null){
如果(真){
//我这里有一些中国逻辑
//没有用,我从下游得到了原始的响应
抛出新的RuntimeException();
}
}
返回getDelegate().getHeaders();
}
};
返回链.filter(exchange.mutate().response(decoratedResponse.build());
}
}
异常处理程序
public class MyWebExceptionHandler implements ErrorWebExceptionHandler {
@Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
byte[] bytes = ( "Some custom text").getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
exchange.getResponse().getHeaders().add("Content-Type", "application/json;charset=UTF-8");
return exchange.getResponse().writeWith(Flux.just(buffer));
}
}
公共类MyWebExceptionHandler实现ErrorWebExceptionHandler{
@凌驾
公共Mono句柄(ServerWebExchange,Throwable-ex){
byte[]bytes=(“一些自定义文本”).getBytes(StandardCharsets.UTF_8);
DataBuffer buffer=exchange.getResponse().bufferFactory().wrap(字节);
exchange.getResponse().getHeaders().add(“内容类型”,“应用程序/json;字符集=UTF-8”);
返回exchange.getResponse().writeWith(Flux.just(buffer));
}
}
预计产量为
一些自定义文本
但是我得到了一个原始响应有关如何修改响应正文的示例,请参见。实际上,您正在尝试在收到响应之前修改它(tokenFromHeader!=null和®IdFromHeader!=null)为此,我添加了这个条件@Spencergibi尝试了一种不同的方法来修改回复正文,但没有像预期的那样在spring论坛上发布相同的内容。我将尝试您的示例@Spencergibsee,以了解如何修改回复正文。您实际上是在收到回复之前尝试修改回复(tokenFromHeader!=null&®IdFromHeader!=null)为此,我添加了此条件@Spencergibi尝试了一种不同的方法来修改响应正文,但没有按预期工作在spring论坛上发布相同的结果。我将尝试您的示例@Spencergib