我正在使用Zuul代理一个奇怪的客户端,该客户端将一个正文作为GET请求的一部分发送。遗憾的是,我无法改变客户。
使用curl这样的请求可以发送:
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 :(得分:1)
似乎某些基础机器[0],例如一些内置的Zuul过滤器,具有较小的过滤顺序,取代了默认的" raw" HttpServletRequest
HttpServletRequestWrapper
GET
,在标准情况下(即不是身体的GET
方法),能够处理输入流的多次采集。但是对于HttpServletRequestWrapper
方法,正文filterOrder
似乎不代理输入流。
因此解决方案可能是更改-10
,例如到HttpServletRequest
。
然后它适用于过滤器,因为使用了HttpServletRequest
- 提到的机制没有轮到它,因此还没有用HttpServletRequestWrapper
替换GET
。但是这个解决方案的潜在问题是过滤器可能会耗尽其他输入流,例如:筛选器具有更高的筛选顺序但是,由于身体{{ Form::text('description[$i]', null, array('class' => 'form-control', 'placeholder' => 'Description')) }}
无论如何都不是一个好习惯,毕竟它可能是一个很好的解决方案:)
[0]我已经在很久以前调试了这个问题,但没有达到准确的程度 - 因此对机器的定义模糊不清。