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

时间:2020-01-17 03:41:42

标签: vert.x kotlin-coroutines

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

我正在使用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"

我想在处理正文请求之前验证auth。但是我遇到了错误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),一切都会很好。

2 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为当您确认请求时,内容一直在到达并且已被丢弃。

您需要先在处理程序中调用<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#2EBAC6" android:endColor="#4DDCE8" android:angle="180" /> <corners android:radius="300dp" /> ,然后在准备好后调用context.request().pause()

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

答案 1 :(得分:0)

最后,我确实解决了。

我的路由器正在处理这些流:

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
}

它正在和我一起工作。希望能对您有所帮助。谢谢!