在 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 中保持高分辨率图像而不使其像素化?