java - 如何在 Zuul post filter 中获取响应体?

标签 java proxy netflix-zuul

post 过滤器中使用 Zuul 作为代理时如何读取响应主体?

我正在尝试这样调用代码:

@Component
public class PostFilter extends ZuulFilter {

    private static final Logger log = LoggerFactory.getLogger(PostFilter.class);

    @Override
    public String filterType() {
        return "post";
    }

    @Override
    public int filterOrder() {
        return 2000;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        ctx.getResponseBody(); // null

        // cant't do this, cause input stream is used later in other filters and I got InputStream Closed exception
        // GZIPInputStream gzipInputStream = new GZIPInputStream(stream);
        return null;
    }

}

最佳答案

我已经设法克服了这个问题。该解决方案包括 4 个步骤:

  1. ctx.getResponseDataStream() 读入 ByteArrayOutputStream
  2. 将 OutputStream 复制到 2 个 InputStreams。
  3. 将其中之一用于您的自定义目的。
  4. 使用第二个重新分配给上下文:context.setResponseBody(inputStream)
    • 从点 1 读取流会导致无法再次读取该流,因此您将通过这种方式传递一个尚未读取的新流

关于java - 如何在 Zuul post filter 中获取响应体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35088498/

相关文章:

java - 如何使 Java "trust"成为过期证书?

java - 在 switch 语句退出选项中尝试 catch

java - 给定约束的 Java 中最大大小的子集

proxy - Docker容器,如何使用主机代理

spring-cloud - 使用 Zuul 基于 Eureka 元数据过滤服务

spring-boot - 如何在微服务架构中实现基于角色的安全

spring - 基于 Spring 的 Websocket Netflix Zuul

java - 用java设置音量

javascript - 链接 JavaScript (ES6) 代理对象

java - 如何在Windows中设置sbt代理