首页 > 解决方案 > netty 文件上传与 auth,如果 auth 失败,我该如何丢弃左边的 httpConent?

问题描述

我正在使用 netty 来开发文件上传服务器,当客户端上传文件时,它需要包含身份验证信息,例如在任何文件之前放入表单正文的令牌。如果token不匹配,服务器返回错误码并关闭频道,我的问题是如何丢弃左侧的HttpConent数据?我看过netty文件上传demo,但我无法得到答案。</ p>

标签: netty

解决方案


您可以想到 2 个选择:

  1. 无论发生什么,都消耗所有数据,然后忽略这些内容,然后发送响应:不方便,您必须等待所有数据进入

  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
 }

请注意,从客户端的角度来看,如果它没有发送所有数据,如果它在结束发送自己的正文之前没有处理接收答案,它可能会以“过早关闭的连接”结束。

另请注意,通常,令牌位于标题部分,而不是正文部分......但这取决于您的实现。


推荐阅读