netty - netty 文件上传与 auth,如果 auth 失败,我该如何丢弃左边的 httpConent?
问题描述
我正在使用 netty 来开发文件上传服务器,当客户端上传文件时,它需要包含身份验证信息,例如在任何文件之前放入表单正文的令牌。如果token不匹配,服务器返回错误码并关闭频道,我的问题是如何丢弃左侧的HttpConent数据?我看过netty文件上传demo,但我无法得到答案。</ p>
解决方案
您可以想到 2 个选择:
无论发生什么,都消耗所有数据,然后忽略这些内容,然后发送响应:不方便,您必须等待所有数据进入
当您知道响应结束(身份验证失败)时立即发送响应,例如:
final ChannelFuture f = ctx.writeAndFlush(response); // (1) f.addListener(ChannelFutureListener.CLOSE); // (2)
(1) 刷新你的答案(错误)
(2) 当发送应答时,关闭上下文,关闭通道,关闭连接。
优点:这会立即停止接收操作
缺点:但您可能必须在此连接的会话中存储此连接是错误的,因为更多的缓冲区可能已经到达或即将开始,并且
channelRead
即使在 (2) 之前的 (1) 发生之后也可以调用。因此,在这种情况下,您将不得不默默地忽略那些新缓冲区。
就像是:
private boolean inError = false;
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf m = (ByteBuf) msg;
if (inError) {
msg.release();
return;
}
...
if (!isTokenOk(token)) {
inError = true;
... build your response in error
final ChannelFuture f = ctx.writeAndFlush(response);
f.addListener(ChannelFutureListener.CLOSE);
return;
}
... continue with other part of buffers
}
请注意,从客户端的角度来看,如果它没有发送所有数据,如果它在结束发送自己的正文之前没有处理接收答案,它可能会以“过早关闭的连接”结束。
另请注意,通常,令牌位于标题部分,而不是正文部分......但这取决于您的实现。
推荐阅读
- javascript - OIDC 客户端 + 身份服务器 4,设置 max_age 静默令牌更新不起作用
- javascript - 如何将 NodeJS 中的 SSE 与第三方 API 调用集成
- java - 获取智能合约事件(web3j)
- javascript - 使用 JS 在购物车中渲染
- image-processing - 如何生成图像的像素数据
- git - Git describe 命令在没有任何更改后返回不同的值
- r - 和弦图:隐藏指向同一扇区的箭头
- c# - 异常中的错误代码
- java - 为什么@ComponentScan 对于不同的配置文件表现不同?
- flutter - 如何更改背景颜色并将自定义字体添加到我的介绍场景中?