如何在处理正文请求之前验证身份验证?
我正在使用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)
,一切都会很好。
答案 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
}
它正在和我一起工作。希望能对您有所帮助。谢谢!