spring cloud gateway java.lang.IllegalStateException: Only one connection receive subscriber allowed.

spring-cloud-gateway反向代理的原理是,首先读取原请求的数据,然后构造一个新的请求,将原请求的数据封装到新的请求中,然后再转发出去。然而我们在他封装之前读取了一次request body,而request body只能读取一次。因此就出现了上面的错误。

大意就是netty的request body只能读取一次,第二次读取就报这个错误了。

问题原因

翻查GitHub终于找到,spring boot在2.0.5版本如果使用了WebFlux就自动配置HiddenHttpMethodFilter过滤器。
查看源码发现,这个过滤器的作用是,针对当前的浏览器一般只支持GET和POST表单提交方法,如果想使用其他HTTP方法(如:PUT、DELETE、PATCH),就只能通过一个隐藏的属性如(_method=PUT)来表示,那么HiddenHttpMethodFilter的作用是将POST请求的_method参数里面的value替换掉http请求的方法。
想法是很好的,用一种折中的方法来支持使浏览器支持restful方法。

如果只是使用spring boot,一切都是没有问题的,因为使用的过程中,不需要我们自己解析request body,到controller这一层,这一切就已经完成的了。

但是spring cloud gateway需要,因为它的做法就是拿到原始请求信息(包括request body),再重新封装一个request路由到下游微服务,所以上面的问题就在于:

HiddenHttpMethodFilter读取了一次request body;

gateway的封装自己的request时,去读取request body,就报错了。

所以这个是spring cloud gateway和spring boot开发者没协商好,都去读取request body的问题。

问题解决方案

HiddenHttpMethodFilter是spring boot在2.0.5版本自动引入的,将版本降到2.0.4即可。
如果不降版本,也可以自己重写HiddenHttpMethodFilter来覆盖原来的实现,如下:

@Beanpublic HiddenHttpMethodFilter hiddenHttpMethodFilter() {return new HiddenHttpMethodFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {return chain.filter(exchange);}};}

filter方法什么都不做,自然就不会读取request body了,你可能会想,那不就不支持HiddenHttpMethodFilter的功能了吗,其实gateway本身就不应该做这种事情,原始请求是怎样的,转发给下游的请求就应该是怎样的。下游服务如果使用的是也是spring boot的服务,那么下游服务自己会做HiddenHttpMethodFilter的功能。

参考资料

  1. https://github.com/spring-cloud/spring-cloud-gateway/issues/541
  2. https://blog.csdn.net/hong10086/article/details/92396319

spring cloud gateway java.lang.IllegalStateException:Only one connection receive subscriber allowed.相关推荐

  1. spring cloud gateway Unhandled failure: Only one connection receive subscriber allowed.

    https://gist.github.com/WeirdBob/b25569d461f0f54444d2c0eab51f3c48 ToUppercaseGlobalFilter.java https ...

  2. spring cloud gateway - 日志

    spring cloud gateway - 日志 实现日志 前提:spring cloud gateway是基于webflux的项目,所以不能像使用spring mvc一样直接获取request b ...

  3. Spring Cloud Gateway 之获取请求体的几种方式

    一.直接在全局拦截器中获取 伪代码如下 private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest){Flux& ...

  4. android java.lang.illegalstateexception,Android异常 java.lang.IllegalStateException解决方法

    Android异常详情介绍 这种异常我遇到以下两种情况: 1. java.lang.IllegalStateException: No wrapped connection. 2.java.lang. ...

  5. Spring Cloud RestTemplate报错:java.lang.IllegalStateException: No instances available for xxx

    java.lang.IllegalStateException: No instances available for XXXX 一.问题复现 最近搭建springCloud项目,搭建Eureka,多 ...

  6. java.lang.IllegalStateException: Error processing condition on com.alibaba.cloud.nacos.discovery.rea

    ERROR: java.lang.IllegalStateException: Error processing condition on com.alibaba.cloud.nacos.discov ...

  7. Spring Boot整合Nacos时遇到 java.lang.IllegalStateException: Context has been already given a name 的解决办法

    问题概述 在进行项目开发过程中,通过Spring Boot整合Alibaba Nacos的服务注册与发现和配置中心时,遇到个梗,启动时打印出一串错误日志信息 " Failed to rena ...

  8. IDEA| java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.context

    问题:java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.context.pr ...

  9. 【spring_Cloud】java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud

    java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.netflix.eurek ...

  10. idea使用spring框架Exception in thread main java.lang.IllegalStateException错误

    自己在用idea自动导包使用spring框架的时候 出现如下错误异常: Exception in thread "main" java.lang.IllegalStateExcep ...

最新文章

  1. sharepoint 备份还原
  2. 北京数码视讯s905l固件_神州数码与MAXHUB构建更紧密的伙伴关系,共同开启可持续发展之旅...
  3. Apache Shiro Architecture--官方文档
  4. 白话Elasticsearch36-深入聚合数据分析之案例实战Histogram Aggregation:按价格区间统计电视销量和销售额
  5. 吴恩达机器学习(第五章)——Logistic回归
  6. 教育机构如何提升在线教育技术能力? | 云+社区技术沙龙
  7. 超越JAX-RS规范:Apache CXF搜索扩展
  8. js获取鼠标所在html元素的id和属性
  9. [工具]将xml文件转换为html显示
  10. C/C++ 位域总结
  11. int和Integer有什么区别
  12. 什么时候跳槽,为什么离职,你想好了么?
  13. 百度云盘停止服务器,又一家网盘关闭!不要再问为什么百度网盘要收费了
  14. p2p网络测试工具_(官方更新)IPFS的网络层——libp2p在2020的发展
  15. 实现Swap函数,将两个数交换
  16. 闭锁java_Java项目实践,CountDownLatch实现多线程闭锁
  17. 矩阵合同与相似,为什么只有当C为正交阵时才能使既相似又合同?
  18. Python爬取QQ音乐内地专辑
  19. Houdini软体简介
  20. 我与小娜(01):回到过去,探索未知

热门文章

  1. 六问阿里云计算安全,全面解析阿里云ECS服务器的计算安全进化之路
  2. Kafka从上手到实践-Kafka集群:重要配置和性能探讨 | 凌云时刻
  3. 坚持开源、能力内化,中移苏研荣获“中国开源领军企业”大奖!
  4. 毕设题目:Matlab水果识别分级
  5. 【TSP】基于matlab GUI遗传算法求解旅行商问题【含Matlab源码 1333期】
  6. 【优化算法】人工鱼群优化算法(AFSA)【含Matlab源码 1078期】
  7. 【车牌识别】基于matlab GUI RGB颜色模型车牌识别【含Matlab源码 888期】
  8. 【情感识别】基于matlab GUI SVM语音情感识别【含Matlab源码 869期】
  9. 【元胞自动机】基于matlab元胞自动机四车道交通流【含Matlab源码 039期】
  10. 2中我建的表怎么是小写的_面试官:2个线程交替打印大小写英文字母,你会怎么实现?...