在 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 个步骤:
- 将
ctx.getResponseDataStream()
读入 ByteArrayOutputStream - 将 OutputStream 复制到 2 个 InputStreams。
- 将其中之一用于您的自定义目的。
- 使用第二个重新分配给上下文:
context.setResponseBody(inputStream)
- 从点 1 读取流会导致无法再次读取该流,因此您将通过这种方式传递一个尚未读取的新流
关于java - 如何在 Zuul post filter 中获取响应体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35088498/