记录SpringCloudGateway无法完成转发Websocket的问题

这篇具有很好参考价值的文章主要介绍了记录SpringCloudGateway无法完成转发Websocket的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

使用SpringCloudGateway作为网关转发Websocket链接到微服务。


问题描述

SpringCloudGateway无法完成Websocket的转发,表现为无法链接。


原因分析:

我遇到的问题具体有两个原因导致。

  1. 跨域问题

我其实已经配置了,但是少加了一个s,allowedOrigins写成了allowedOrigin
花了我八个小时看源码 自闭

因为SpringGateway有一个默认的跨域Filter:CorsWebFilter。这个过滤器使用DefaultCorsProcessor检查了跨域问题。当调用方的域名非同源并且不在允许列表中时会拒绝访问。文章来源地址https://www.toymoban.com/news/detail-427067.html

	@Override
	public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
		ServerHttpRequest request = exchange.getRequest();
		CorsConfiguration corsConfiguration = this.configSource.getCorsConfiguration(exchange);
		boolean isValid = this.processor.process(corsConfiguration, exchange); // 调用进行跨域验证
		if (!isValid || CorsUtils.isPreFlightRequest(request)) {
			// 非同源且不在允许范围内
			// 不处理(不转发)
			return Mono.empty();
		}
		return chain.filter(exchange);
	}
  1. 网关微服务引入了tomcat的依赖
    SpringGateway使用了Netty作为容器,而Netty天生支持长连接所以可以进行转发。而项目中如果引入了Tomcat的相关依赖则会将容器替换为Tomcat导致无法转发。具体原因是ServerHttpResponseDecorator这个类中的getNativeResponse这个方法会去对响应体进行强制转换,但是Tomcat的Response和Netty的Response不一样,从而导致抛出ClassCastException。
	/**
	 * Return the native response of the underlying server API, if possible,
	 * also unwrapping {@link ServerHttpResponseDecorator} if necessary.
	 * @param response the response to check
	 * @param <T> the expected native response type
	 * @throws IllegalArgumentException if the native response can't be obtained
	 * @since 5.3.3
	 */
	public static <T> T getNativeResponse(ServerHttpResponse response) {
		if (response instanceof AbstractServerHttpResponse) {
			// 这一段会导致抛出ClassCastException
			return ((AbstractServerHttpResponse) response).getNativeResponse();
		}
		else if (response instanceof ServerHttpResponseDecorator) {
			return getNativeResponse(((ServerHttpResponseDecorator) response).getDelegate());
		}
		else {
			throw new IllegalArgumentException(
					"Can't find native response in " + response.getClass().getName());
		}
	}

解决方案:

  1. 跨域问题
    在配置文件中加入以下配置:
spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        cors-configurations:
          # 这里可以自定义哪些url会匹配跨域定义
          '[/**]':
            allowedOrigins: "*"	# 这里定义允许的跨域host,如果为*则全部允许
            allowedMethods: "*"	# 同上
            allowedHeaders: "*"	# 同上
  1. 引入了tomcat的依赖
    检查依赖,如果存在下列依赖需要去除。
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
</dependency>
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
</dependency>
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
</dependency>

到了这里,关于记录SpringCloudGateway无法完成转发Websocket的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决机械革命等笔记本电脑系统无法完成更新无法关机自动重启问题的两种方案

    1. 首先是更改自动重启的设置  具体如下图 首先打开设置,在左下角开始处 设置图标。也可以搜索打开 打开系统 下拉点击关于 再下拉找到高级系统设置 点击高级 设置  取消勾选的自动重新启动选项  点击确定     2. 还是打开设置  点击更新与安全  进入恢复页面 下拉

    2024年02月16日
    浏览(340)
  • 【pytorch问题解决】OSError: [WinError 1455] 页面文件太小,无法完成操作。

    在windows上面跑pytorch代码,导致: OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading “D:pythonAnancodaenvstorch38libsite-packagestorchlibcaffe2_detectron_ops_gpu.dll” or one of its dependencies. 就是说由于一下要加载一些数据,但是数据大小超过了电脑能够分配的空间,所以导致

    2024年02月12日
    浏览(47)
  • 记录一次springboot+netty+websocket报错的问题

    报错内容 io.netty.handler.codec.htttp.websocketx.textwebsocketframe can not be cast to io.netty.handler.codec.http.FullHttpRequest; 核心问题 springboot项目设定了项目访问前缀,/project/ 而我只给websocket设定了单独的访问路径 pipeline.addLast(new WebSocketServerProtocolHandler(“/msg”)); 前台初始化websocket的路径是

    2024年02月15日
    浏览(39)
  • 解决websocket在部署到服务器https下无法使用的问题

    目录 一、问题 1.1 问题描述 1.2 问题详细描述 二、解决 2.1 https下的链接类型 2.2 修改Nginx的配置 一个小项目中使用到了websocket,这个websocket在本地完全是完全正常运行的,不管是 前后台的信息通讯  还是 异常报错接收 , 无任何异常 ,但当把后台代码部署到阿里云服务器后

    2024年02月09日
    浏览(32)
  • SpringCloudGateway集成SpringDoc CORS问题

    集成SpringDoc后,在gateway在线文档界面,请求具体的服务接口,报CORS问题 Failed to fetch. Possible Reasons: CORS Network Failure URL scheme must be “http” or “https” for CORS request. 其实是网关直接请求具体服务/v3/api-docs接口(默认),获取文档数据,里面包含该服务注册上来的地址,gateway swa

    2024年02月10日
    浏览(34)
  • nginx请求转发webSocket

    原由 1.我有一个socket服务,用ip访问是成功的,但是老板说用这个不行,要用nginx请求转发,转发内网地址到某个域名 2.但是我改成了指定域名后失败, 因为我没有配置 nginx.conf  http的很简单 ,如下(--- 可跳过 ---) server {     listen 80;     server_name *.mynetwork.cn mynetwork.cn;     

    2024年02月01日
    浏览(37)
  • nginx 配置支持websocket转发

    编辑nginx.conf,在http区域内一定要添加下面配置: http {     #自定义变量 $connection_upgrade     map $http_upgrade $connection_upgrade {         default          keep-alive;  #默认为keep-alive 可以支持 一般http请求         \\\'websocket\\\'      upgrade;     #如果为websocket 则为 upgra

    2024年02月06日
    浏览(46)
  • IDEA 安装完成无法打开&排查&插件问题 bat脚本中pause的作用:pause命令可以让脚本程序暂停。

    以前我自己遇到IDEA(19.3)突然打不开了、所以写过一篇 IDEA无法正常启动(打不开报错)_idea启动报错_DJyzh的博客-CSDN博客 版权声明:转载请附上文章地址https://blog.csdn.net/qq_42672839IDEA无法正常启动 今天在清理电脑后遇到一个问题,双击IDEA图标无法启动给出了一长串的错误。

    2024年02月16日
    浏览(40)
  • Docker无法部署Onlyoffice问题记录

    国产操作系统(麒麟v10-x86-64bit,openEuler20.03 64bit x86),安装docker之后,通过docker run之后Onlyoffice无法成功跑起来,且会消耗大量cpu资源,甚至导致系统卡死 镜像的entrypoint中指向运行一个sh脚本,脚本中通过service命令启动rabbitmq,但是一直无法成功启动,且一直处于循环尝试导

    2024年01月18日
    浏览(43)
  • 解决Linux下 “正在读取软件包列表... 完成 ....E:无法定位软件包 xx-xx-xxx” 问题

    相信很多朋友在刚安装Ubuntu或CentOS7等其他虚拟机不久时,如果想编译或使用相关工具时,安装相关库、插件等肯定是少不了的,所以这篇文章就来给大家解决安装库、插件等时最常见的一个问题 : 出现该问题说明您安装的虚拟机 软件源有问题,所以您需要换源(这里我推荐

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包