在 Zuul 预过滤器中修改请求正文不起作用



在我的应用程序中,我正在使用netflix zuul将请求从微服务(网关(路由到另一个微服务(网关(。请求路由良好,但我还想在将请求正文路由到适当的微服务之前在请求正文中引入一些参数。为此,我像这样使用 Zuul 预过滤器。

public class SimpleFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(SimpleFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
try {
RequestContext context = RequestContext.getCurrentContext();
InputStream in = (InputStream) context.get("requestEntity");
if (in == null) {
in = context.getRequest().getInputStream();
}
String body = StreamUtils.copyToString(in, Charset.forName("UTF-8"));
// body = "request body modified via set('requestEntity'): "+ body;
body = body.toUpperCase();
context.set("requestEntity", new ByteArrayInputStream(body.getBytes("UTF-8")));
} catch (IOException e) {
log.error(e.getMessage(), e);
}
return null;
}
}

目前,我只是尝试将正文更改为大写,但此请求路由到的微服务未收到修改后的正文(大写(。相反,它接收原始的。我做错了什么吗?任何帮助将不胜感激。谢谢!!

能够执行以下操作 - 将 GET 请求转换为 POST 请求,并将正文内容添加到(代理(POST 请求中。

public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
context.addZuulRequestHeader("Content-Type", "application/x-www-form-urlencoded");
String body = String.format("a=%s&b=%s", a, b);
final byte[] bytes = body.getBytes(StandardCharsets.UTF_8);
context.setRequest(new HttpServletRequestWrapper(context.getRequest()) {
@Override
public ServletInputStream getInputStream() {
return new ServletInputStreamWrapper(bytes);
}
@Override
public int getContentLength() {
return bytes.length;
}
@Override
public long getContentLengthLong() {
return bytes.length;
}
@Override
public String getMethod() {
return "POST";
}
});
return null;
}

试试这个可能是你的情况下的工作。

requestContext.getCurrentContext().put("requestEntity", new ByteArrayInputStream(body.getBytes("UTF-8")));

事实证明,此方法无法更改请求上下文中的请求正文。确实在requestContext中,添加了一个新字段"requestEntity",但是,来自context.getRequest((.getInputStream((的请求正文在此操作后保持不变。

您可以修改请求正文,有关示例,请参阅此答案。您只需要包装新的请求数据,并确保正确报告其新内容长度。

最新更新