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

发生这种情况是因为在您发出请求时,内容已不断到达并已被丢弃。

您需要首先在处理程序中调用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
}

它正在与我合作。希望对您有所帮助。谢谢!

相关内容

最新更新