Servlets 用Zuul处理身体
我使用Zuul代理一个奇怪的客户端,该客户端在GET请求中发送一个主体。不幸的是,我无法改变客户 使用curl,可以通过以下方式发送此类请求:Servlets 用Zuul处理身体,servlets,netflix-zuul,spring-cloud-netflix,Servlets,Netflix Zuul,Spring Cloud Netflix,我使用Zuul代理一个奇怪的客户端,该客户端在GET请求中发送一个主体。不幸的是,我无法改变客户 使用curl,可以通过以下方式发送此类请求: curl -XGET 'localhost:8765/kibana/index.html' -d' {"key": "value"}' 数据实际上是在体内传送的。然而,在zuul方面,当我试图阅读身体时,它是空的。以下是我的zuul原型代码: @Configuration @ComponentScan @EnableAutoConfiguration
curl -XGET 'localhost:8765/kibana/index.html' -d' {"key": "value"}'
数据实际上是在体内传送的。然而,在zuul方面,当我试图阅读身体时,它是空的。以下是我的zuul原型代码:
@Configuration
@ComponentScan
@EnableAutoConfiguration
@Controller
@EnableZuulProxy
public class ZuulServerApplication {
@Bean
public ZuulFilter myFilter() {
return new ZuulFilter(){
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request=(HttpServletRequest)ctx.getRequest();
try {
InputStream is=request.getInputStream();
String content=IOUtils.toString(is);
System.out.println("Request content:"+content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public int filterOrder() {
return 10;
}
@Override
public String filterType() {
return "pre";
}};
}
public static void main(String[] args) {
new SpringApplicationBuilder(ZuulServerApplication.class).web(true).run(args);
}
}
如果我发送POST请求,此代码将毫无问题地打印请求正文。但是,如果我发送上述GET请求,则不会打印正文。我能做些什么来真正将正文作为get请求的一部分发送?似乎有一些底层机制[0],例如,一些具有较低过滤顺序的内置Zuul过滤器,将默认的“原始”
HttpServletRequest
替换为HttpServletRequestWrapper
,在标准情况下(即不带主体的GET
方法),能够处理输入流的多次采集。但是在GET
带主体的方法的情况下HttpServletRequestWrapper
似乎根本不是代理输入流
因此,解决方案可能是更改过滤器顺序
,例如更改为-10
然后,由于使用了HttpServletRequest
,因此它对过滤器有效-所提到的机制没有轮到它,因此没有用HttpServletRequestWrapper
替换HttpServletRequestWrapper
。但此解决方案的潜在问题是,过滤器可能会为其他东西(例如过滤器)耗尽输入流使用更高的过滤器顺序。但由于使用body的GET
无论如何都不是一个好的实践,它可能是足够好的解决方案:)
[0]我很久以前就调试过这个问题,但没有达到确切的目的-因此“机器”的定义很模糊。当输入流是带有主体的
get
方法时,一些底层机器似乎不代理输入流。由于当filterover
为10
时,HttpServletRequestWrapper
将从ctx.getRequest()
返回,它通常能够处理输入流的多次采集。如果将filterOrder
更改为例如-10
,则它适用于此筛选器,因为使用了更多原始HttpServletRequest
(没有其他筛选器可以将HttpServletRequest
替换为HttpServletRequestWrapper
)。但它可能会因为其他原因耗尽输入流。这对我来说是个好消息。我测试过了,它能工作。你介意发帖回答吗?那很好。我做了一些详细说明。