首页 > 解决方案 > Vertx:如何在处理正文请求之前验证身份验证?

问题描述

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

我正在使用顶点:

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),它将正常工作。

标签: vert.xkotlin-coroutines

解决方案


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

您需要context.request().pause()在您的第一个处理程序中调用,然后context.request().resume()在您准备好时调用。

在大多数情况下,让管理有效负载更容易BodyHandler


推荐阅读