java - 如何在Zuul后置过滤器中拦截和编辑响应体?

标签 java spring-boot proxy netflix-zuul

我正在使用 Zuul 后置过滤器来拦截响应。我的要求是向响应 json 添加一个新字段。我能够拦截响应并对其进行编辑。但是,无法将更新后的响应设置为 RequestContext。在后置过滤器中使用 Zuul 作为代理时,如何读取响应正文、编辑并将其更新回 RequestContext?

请找到我正在使用的以下代码。

private void updateResponseBody(RequestContext ctx) throws IOException, JSONException {

    final InputStream responseDataStream = ctx.getResponseDataStream();
    String responseData = CharStreams.toString(new InputStreamReader(responseDataStream, "UTF-8"));
    JSONObject jsonObj = new JSONObject(responseData);
    JSONArray groupsArray = jsonObj.getJSONArray("list");
    for (int i = 0; i < groupsArray.length(); i++) {
        JSONObject groupId = groupsArray.getJSONObject(i);
        groupId.accumulate("new_json_field_name", "new_json_field_value");
    }
    String updatedResponse = jsonObj.toString();
    // ctx.setResponseBody(body); // also not working
    ctx.setResponseDataStream(org.apache.commons.io.IOUtils.toInputStream(updatedResponse, "UTF-8"));

}

我收到的错误是:

Error while sending response to client: java.io.IOException: An existing connection was forcibly closed by the remote host.

任何人都可以帮我解决这个问题吗?

最佳答案

我遇到了同样的错误,并疯狂地修改How to get response body in Zuul post filter?中描述的代码尝试不同的可能性。最后我在this post中找到了解决方案通过在 servletResponse.getOutputStream() 而不是 ctx.setResponseDataStream()OutputStream 中写入答案:

HttpServletResponse servletResponse = ctx.getResponse();

  ...

String updatedResponse = jsonObj.toString();
try {
    OutputStream outStream = servletResponse.getOutputStream();
    outStream.write(updatedResponse.getBytes(), 0, updatedResponse.length());
    outStream.flush();
    outStream.close();
} catch (IOException e) {
    log.warn("Error reading body", e);
}

关于java - 如何在Zuul后置过滤器中拦截和编辑响应体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56733426/

相关文章:

java - 同一台服务器多个jre和多个tomcat实例

java - 如何在 H2 中将周数格式化为所需格式

Java 堆空间 - 无法设置得足够大

java - Spring Boot - Spring Security - InvalidBearerTokenException 错误处理

java - "java.lang.IllegalArgumentException: Not a managed type ..."当实体类和Spring数据存储库在同一个包中时

go - Golang 中的 HTTP 重定向

java - 价格的正则表达式 - Android

java - 总是调用 Mono switchIfEmpty()

linux - 在 "@"之前添加什么让它被系统忽略?

java - 在Java中构建 "isolated"和 "automatically updated"缓存(java.util.List)