当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud Gateway-尝试读取Web筛选器中的请求正文时,请求卡住

戚阳
2023-03-14

我是Spring Cloud Gateway的新手(Spring引导2.0.5。发布)。我试图从网络过滤器读取请求体,请求只是卡住了,无法通过链。示例代码:

@Component
public class TestFilter implements GlobalFilter, Ordered {

    private static final Logger logger = LoggerFactory.getLogger(TestFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        ServerHttpRequest serverHttpRequest = exchange.getRequest();
        try {
            /* whenever I put the following line. The request cannot get through */
            ByteBuffer byteBuffer = Mono.from(serverHttpRequest.getBody()).toFuture().get().asByteBuffer();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return chain.filter(exchange);
    }
}

如果删除getBody()行,一切都会正常工作。有线索吗?谢谢!

共有1个答案

华善
2023-03-14

看看这里:如何在Spring的“HandlerMethodArgumentResolver”中多次读取请求正文?

这句话解释得相当准确:

最大的问题是我发现HttpServletRequest(从NativeWebRequest获取)不能多次读取输入流(一些参数在请求体中)

 类似资料:
  • 只是为了学习目的,我使用处理程序将所有超文本传输协议请求记录到我的Web API 2应用程序。 这只是打印请求标头如下: 但是我也在POST正文中发送一个json对象,它没有打印。我想打印标题和正文。此外,我在调试时找不到任何东西在'HttpquiestMessage'对象。

  • 我已经使用spring编写了一个拦截器,它以preHandle方法从HTTPServletRequest读取请求正文。请求正文包含json。我还能够读取请求正文,但请求对象发生了一些事情,请求正文变得空白。正因为如此,这个请求正成为一个糟糕的请求。任何帮助都将不胜感激。提前谢谢。

  • 我有一个静态网站托管在AWS CloudFront上。在一条路由上,我需要接受POST方法,因为它是OAuth服务器的重定向,所以我决定开发一个lambda@edge。 我的想法是在'Viewer Request'上注册lambda并截取POST方法,读取正文并复制标头上的值,以使它们在我的静态网站上可读(我知道我可以用javascript访问Referrer标头)。 我设置了Lambda,我可以

  • 问题内容: 我正在用golang编写HTTP处理程序的单元测试。在查看代码覆盖率报告时,我遇到了以下问题:从请求中读取请求正文时,可能会返回我需要处理的错误。但是,当我为我的处理程序编写单元测试时,我不知道如何以触发该错误的方式将请求发送到我的处理程序(内容的结尾过早似乎不会产生这样的错误,但是会在解体身体)。这就是我想要做的: 我该如何为不存在的情况编写测试用例? 问题答案: 您可以创建和使用伪

  • 问题内容: 我正在编写自己的logginMiddleware。基本上,我需要记录请求和响应的正文。我面临的问题是,当我阅读正文时,它变成空的,无法两次阅读。我知道发生这种情况是因为它属于ReadCloser类型。有没有一种方法可以将身体重绕到开始? 问题答案: 检查和嘲笑请求正文 初次阅读主体时,必须对其进行存储,以便在处理完该主体之后,可以将新的主体设置为根据原始数据构造的请求主体。因此,当您在

  • 问题内容: type ValidationModel struct { Name string Email string Password string } 首先,我使用govalidator验证请求正文。 在验证了请求之后,我再次将请求主体解码为用户结构,但已使用validationModel读取了请求主体一次,因此当我尝试再次将其解码为用户时,它没有提供任何值。 我在这里可以想到两种解决方案: