Vertx:如何在处理正文请求之前验证身份验证?

Vertx: How to verify auth before handle body request?

如何在处理正文请求之前验证身份?

我正在使用顶点:

vertxVersion = '3.8.3'
implementation "io.vertx:vertx-core:$rootProject.vertxVersion"
implementation "io.vertx:vertx-web:$rootProject.vertxVersion"
implementation "io.vertx:vertx-lang-kotlin:$rootProject.vertxVersion"
implementation "io.vertx:vertx-lang-kotlin-coroutines:$rootProject.vertxVersion"
implementation "io.vertx:vertx-mongo-client:$rootProject.vertxVersion"
implementation "io.vertx:vertx-auth-mongo:$rootProject.vertxVersion"
implementation "io.vertx:vertx-auth-jwt:$rootProject.vertxVersion"

我想在处理正文请求之前验证身份验证。但是我得到了错误 java.lang.IllegalStateException: Request has already been read

通过使用延迟挂起功能重现:

router.handler { context ->
            launch {
                context.request().setExpectMultipart(true)
                delay(100) //This line is sample for a verify auth process
                context.next()
            }
        }
        .handler {context ->
            println("2")
            context.request()
                .handler {
                    b -> println("buff ${b.length()}")
                }
                .endHandler {
                    println("end handle")
                    context.success("ok")
                }
        }.baseHandle(
            fn
        ).failureHandler {
            println("fail: ${it.failure()}")
            it.error()
        }

当 运行 delay(100)(这是验证过程的示例)时,我得到了上面的错误。如果我评论 delay(100),它将正常工作。

发生这种情况是因为在您对请求进行身份验证时,内容一直在到达并已被删除。

您需要先在处理程序中调用 context.request().pause(),然后在准备就绪后调用 context.request().resume()

在大多数情况下,让 BodyHandler 为您管理负载会更容易。

终于解决了

我的路由器正在处理流量:

router.post("/api/upload/file")
      .baseHandle { checkAuthorization(it) }
      .handleFileUpload { updateFileOnItem(it) }

然后执行以下步骤:

fun checkAuthorization(context: RoutingContext) {
    val request = context.request()
    val tkCookie = request.getCookie("user")
    ...do something to verify user permission
    request.pause()
    context.next()
    context.request().resume()
}

下一个:

fun updateFileOnItem(context: RoutingContext) {
    val file = context.fileUploads()
    ...do something
}

它和我一起工作。希望它可以帮助你。谢谢!