前端代码采用vuejs框架,并且使用了proxymiddlware做代理
服务端代码采用springboot编写并使用了consul服务发现、spring cloudg ateway做网关。
现在的情况是这样,可以通过网关访问后台的swagger-api页面,并且可以正常发送请求测试,返回也正常,但是当在前端配置好网关调用后,从前端页面发送请求后页面直接显示连接失败,spring cloud gateway服务报java.lang.IllegalStateException: Only one connection receive subscriber allowed,从网上搜索后大概意思是请求body只能被获取一次,下面是完整异常
2018-09-20 10:30:54.952 ERROR 13772 --- [ctor-http-nio-2] .a.w.r.e.DefaultErrorWebExceptionHandler : Failed to handle request [POST http://127.0.0.1:8088/gacenter/api/v1/login]
java.lang.IllegalStateException: Only one connection receive subscriber allowed.
at reactor.ipc.netty.channel.FluxReceive.startReceiver(FluxReceive.java:279) ~[reactor-netty-0.7.9.RELEASE.jar:0.7.9.RELEASE]
at reactor.ipc.netty.channel.FluxReceive.lambda$subscribe$2(FluxReceive.java:129) ~[reactor-netty-0.7.9.RELEASE.jar:0.7.9.RELEASE]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_60]
那位大神遇到过这个问题,路过还请留名
实际上spring-cloud-gateway反向代理的原理是,首先读取原请求的数据,然后构造一个新的请求,将原请求的数据封装到新的请求中,然后再转发出去。然而我们在他封装之前读取了一次request body,而request body只能读取一次。因此就出现了上面的错误。
解决思路:读取request body的时候,我们再封装一次request,转发出去
参考 https://blog.csdn.net/weixin_40899682/article/details/82784242