Servlets 用Zuul处理身体

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

我使用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],例如,一些具有较低过滤顺序的内置Zuul过滤器,将默认的“原始”
HttpServletRequest
替换为
HttpServletRequestWrapper
,在标准情况下(即不带主体的
GET
方法),能够处理输入流的多次采集。但是在
GET
带主体的方法的情况下
HttpServletRequestWrapper
似乎根本不是代理输入流

因此,解决方案可能是更改
过滤器顺序
,例如更改为
-10

然后,由于使用了
HttpServletRequest
,因此它对过滤器有效-所提到的机制没有轮到它,因此没有用
HttpServletRequestWrapper
替换
HttpServletRequestWrapper
。但此解决方案的潜在问题是,过滤器可能会为其他东西(例如过滤器)耗尽输入流使用更高的过滤器顺序。但由于使用body的
GET
无论如何都不是一个好的实践,它可能是足够好的解决方案:)


[0]我很久以前就调试过这个问题,但没有达到确切的目的-因此“机器”的定义很模糊。

当输入流是带有主体的
get
方法时,一些底层机器似乎不代理输入流。由于当
filterover
10
时,
HttpServletRequestWrapper
将从
ctx.getRequest()
返回,它通常能够处理输入流的多次采集。如果将
filterOrder
更改为例如
-10
,则它适用于此筛选器,因为使用了更多原始
HttpServletRequest
(没有其他筛选器可以将
HttpServletRequest
替换为
HttpServletRequestWrapper
)。但它可能会因为其他原因耗尽输入流。这对我来说是个好消息。我测试过了,它能工作。你介意发帖回答吗?那很好。我做了一些详细说明。