java - 如何修复 Vert.x 中的 'Request has already been read' 错误

标签 java vert.x

我正在设置一个 API 网关。我想在请求 BE 服务之前验证授权 token 。我收到 IllegalStateException: 请求已被读取。请帮忙。

我将测试项目代码上传到GitHub。 https://github.com/EddyPan/test-demo

router.route().path("/user/admin").method(HttpMethod.POST)
        .handler(rct -> {

            HttpServerRequest request = rct.request().setExpectMultipart(true);

            MultiMap headers = request.headers();

            JsonObject param = new JsonObject().put("requestUrl", "http://localhost:18080/authorize")
                    .put("httpMethod", "POST");

            webClient.postAbs("http://localhost:18080/authorize")
                    .timeout(6000)
                    .putHeader("Content-Type", "application/json")
                    .putHeader("Authorization", headers.get("Authorization"))
                    .as(BodyCodec.jsonObject())
                    .sendJsonObject(param, ar -> authHandler(rct, ar));

        });

异常(exception):

java.lang.IllegalStateException: Request has already been read
    at io.vertx.core.http.impl.HttpServerRequestImpl.checkEnded(HttpServerRequestImpl.java:599)
    at io.vertx.core.http.impl.HttpServerRequestImpl.setExpectMultipart(HttpServerRequestImpl.java:431)
    at io.vertx.ext.web.impl.HttpServerRequestWrapper.setExpectMultipart(HttpServerRequestWrapper.java:208)
    at com.demo.HttpServerVerticle.lambda$start$8(HttpServerVerticle.java:62)
    at io.vertx.ext.web.impl.RouteImpl.handleContext(RouteImpl.java:232)
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:121)
    at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:134)
    at com.demo.HttpServerVerticle.authHandler(HttpServerVerticle.java:132)
    at com.demo.HttpServerVerticle.lambda$null$0(HttpServerVerticle.java:53)
    at io.vertx.ext.web.client.impl.HttpContext.handleDispatchResponse(HttpContext.java:285)
    at io.vertx.ext.web.client.impl.HttpContext.execute(HttpContext.java:272)
    at io.vertx.ext.web.client.impl.HttpContext.next(HttpContext.java:250)
    at io.vertx.ext.web.client.impl.predicate.PredicateInterceptor.handle(PredicateInterceptor.java:69)
    at io.vertx.ext.web.client.impl.predicate.PredicateInterceptor.handle(PredicateInterceptor.java:32)
    at io.vertx.ext.web.client.impl.HttpContext.next(HttpContext.java:247)
    at io.vertx.ext.web.client.impl.HttpContext.fire(HttpContext.java:257)
    at io.vertx.ext.web.client.impl.HttpContext.dispatchResponse(HttpContext.java:218)
    at io.vertx.ext.web.client.impl.HttpContext.lambda$null$2(HttpContext.java:341)
    at io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:320)
    at io.vertx.core.impl.EventLoopContext.lambda$executeAsync$0(EventLoopContext.java:38)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:495)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:748)

最佳答案

我解决了这个问题。在调用 auth api 之前,我暂停原始请求,并在授权完成后恢复缓冲区处理。

router.route().path("/user/admin").method(HttpMethod.POST)
        .handler(rct -> {

            HttpServerRequest request = rct.request().setExpectMultipart(true);

            request.pause(); // Here is to pasue the origin request.

            MultiMap headers = request.headers();

            JsonObject param = new JsonObject().put("requestUrl", "http://localhost:18080/authorize")
                    .put("httpMethod", "POST");

            webClient.postAbs("http://localhost:18080/authorize")
                    .timeout(6000)
                    .putHeader("Content-Type", "application/json")
                    .putHeader("Authorization", headers.get("Authorization"))
                    .as(BodyCodec.jsonObject())
                    .sendJsonObject(param, ar -> authHandler(rct, ar));

        });

关于java - 如何修复 Vert.x 中的 'Request has already been read' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57739853/

相关文章:

java - 图像未显示在 JPanel 中

java - 如何使用 RabbitMQ JMS 客户端从现有的 JMS 应用程序连接到 RabbitMQ?

spring-boot - react 环境中的 spring-cloud-sleuth

java - 如何让测试等待 Vert.x Verticle 部署完成

javabeans - 两台机器 JVM 之间带有 Ignite 集群的集群 vertx 事件总线

java - Vertx HttpClientRequest - 无法捕获超时异常

java - 将 ImageView 中的图像缩放至完整尺寸

java - 将数组列表添加到首选项

java - 有没有办法在 2 路 ssl 连接中从 java 代码恢复客户端证书的通用名称?

java - 对 Verticle 部署进行单元测试