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
}
它和我一起工作。希望它可以帮助你。谢谢!
如何在处理正文请求之前验证身份?
我正在使用顶点:
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
}
它和我一起工作。希望它可以帮助你。谢谢!