在 Undertow 中读取 POST 请求而不使用它

Posted

技术标签:

【中文标题】在 Undertow 中读取 POST 请求而不使用它【英文标题】:Reading a POST request in Undertow without consuming it 【发布时间】:2020-01-25 11:27:27 【问题描述】:

在 Undertow 中,我有两个链接的处理程序:

    第一个处理程序读取请求,然后通过next.handleRequest(exchange);调用第二个处理程序 第二个处理程序是一个代理处理程序,它将请求发送到处理请求的外部服务器。

我的问题是第一个读取请求的处理程序。请求头没什么大不了,但获取 POST 请求的正文数据是个问题。

问题How to properly read POST request body in a Handler?中显示的现有解决方案使用请求主体su,处理程序链接不再起作用。

如何读取请求正文数据而不消耗它或以处理程序链之后无法工作的方式更改请求?

【问题讨论】:

【参考方案1】:

我发现了问题,最后是缺少对ByteBuffer.flip()的调用。

如果有人需要这样的 POST 数据读取器,可以使用AbstractStreamSourceConduit 的以下简化实现,它能够读取传入的 POST 数据而不使用它:

    exchange.addRequestWrapper(new ConduitWrapper<StreamSourceConduit>() 

        @Override
        public StreamSourceConduit wrap(ConduitFactory<StreamSourceConduit> factory, HttpServerExchange exchange) 
            StreamSourceConduit source = factory.create();
            return new AbstractStreamSourceConduit<StreamSourceConduit>(source) 

                ByteArrayOutputStream bout = new ByteArrayOutputStream(8192);

                @Override
                public int read(ByteBuffer dst) throws IOException 
                    int x = super.read(dst);
                    if (x >= 0) 
                        ByteBuffer dup = dst.duplicate();
                        dup.flip();
                        byte[] data = new byte[x];
                        dup.get(data);
                        bout.write(data);
                     else 
                        // end of stream reached
                        byte[] data = bout.toByteArray();
                        // ... to something with data
                    
                    return x;
                

            ;
        
    );

【讨论】:

以上是关于在 Undertow 中读取 POST 请求而不使用它的主要内容,如果未能解决你的问题,请参考以下文章

在 useEffect 中使用 useState 值而不使状态更新 useEffect

调整画布图像大小而不使其模糊

如何在 Xcode 的 Storyboard 中保持高分辨率图像而不使其像素化?

在 grails gsp 模板中,如何使用服务器端注释而不使站点网格抛出错误?

在 UITextField 上启用复制和粘贴而不使其可编辑

使 MKMapView 的背景颜色变暗而不使 MKOverlay 变暗