当前位置: 首页 > news >正文

springboot与vue中webSocket前后端连接问题

写在最前:在项目中发现前端在连接后端服务器websocket时,使用127.0.0.1IP访问一切正常,到生产环境指定IP后突然报错:

报错1:

Uncaught Error: Incompatibile SockJS! Main site uses: “1.6.1”, the
iframe: “1.0.0”.

报错2:

GET http://192.168.1.22:8088/ws/751/pl2birne/jsonp?c=_jp.aaxo0yy
net::ERR_ABORTED 404 (Not Found)

使用的boot版本:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.2.4.RELEASE</version>
</dependency>

使用的websocket配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {// 启用简单的消息代理,前缀为/topic的消息会发送到消息代理config.enableSimpleBroker("/topic");// 应用程序以/app为前缀的消息会路由到@MessageMapping注解的方法config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {// 注册STOMP端点,客户端将使用它连接到WebSocket服务器registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();}}

使用的前端连接socket代码:

import {Client} from '@stomp/stompjs'
import SockJS from 'sockjs-client'const createWebSocketClient = () => {let client = nullconst subscriptions = new Map()const wsBaseUrl = window.SITE_CONFIG.baseUrlconst wsEndpoint = '/ws'let messageListeners = []const connect = () => {return new Promise((resolve, reject) => {if (client && client.connected) {resolve()return}client = new Client({webSocketFactory: () => new SockJS(`${wsBaseUrl}${wsEndpoint}`),debug: (str) => console.debug('[WebSocket]', str),reconnectDelay: 5000,heartbeatIncoming: 4000,heartbeatOutgoing: 4000,onConnect: () => {console.log('[WebSocket] Connected successfully')notifyListeners('connected')resolve()},onStompError: (frame) => {console.error('[WebSocket] Connection error:', frame.headers.message)notifyListeners('error', frame.headers.message)reject(new Error(frame.headers.message || 'Connection failed'))},onDisconnect: () => {console.log('[WebSocket] Disconnected')notifyListeners('disconnected')},onWebSocketError: (error) => {console.error('[WebSocket] WebSocket error:', error)notifyListeners('error', error.message)},onWebSocketClose: (event) => {console.log('[WebSocket] WebSocket closed:', event)notifyListeners('closed', event)}})client.activate()})}const subscribe = (destination, callback) => {if (!client || !client.connected) {console.error('[WebSocket] Cannot subscribe - not connected')return null}const subscription = client.subscribe(destination, (message) => {console.log(`[WebSocket] Received message on ${destination}:`, message.body)callback(message.body)notifyListeners('message', {destination,body: message.body})})subscriptions.set(destination, subscription)return subscription}const disconnect = () => {if (client) {subscriptions.forEach(sub => sub.unsubscribe())subscriptions.clear()client.deactivate()console.log('[WebSocket] Disconnected')}}const addMessageListener = (callback) => {messageListeners.push(callback)return () => {messageListeners = messageListeners.filter(listener => listener !== callback)}}const notifyListeners = (event, data) => {messageListeners.forEach(listener => listener(event, data))}return {connect,subscribe,disconnect,addMessageListener,subscribeUsersChanged: (callback) => subscribe('/topic/xxx-topic', callback)}
}// 导出单例实例
export const webSocketClient = createWebSocketClient()

sockjs-client版本为:^1.6.1

好,如果使用以上配置时线下调试用127.0.0.1完全没问题,放到线上不是跨域就是请求/ws接口404,甚至偶尔又能请求成功,想到/ws前缀后端全放行无权限问题但就是死活报错,结果查阅大量资料后都说把setAllowedOrigins换成setAllowedOriginPatterns方法,但目前项目用的springboot版本2.2.4还没有此方法,无奈升级springboot版本到2.4.9使用setAllowedOriginPatterns方法后一下就好了。。。无语大坑,记录一下!


文章转载自:

http://oAlpP1jT.pqcbx.cn
http://qfeDAbFb.pqcbx.cn
http://BQE3mhwa.pqcbx.cn
http://wftaxXLy.pqcbx.cn
http://0AkSVFn7.pqcbx.cn
http://P2j2KMuY.pqcbx.cn
http://nkVI0Keb.pqcbx.cn
http://MJBgAODj.pqcbx.cn
http://Ur787y0i.pqcbx.cn
http://oWW7WWlV.pqcbx.cn
http://gwZTpmtQ.pqcbx.cn
http://dhe0d89a.pqcbx.cn
http://zfSysvHQ.pqcbx.cn
http://mZXyMZfj.pqcbx.cn
http://pLKMrLEd.pqcbx.cn
http://wv1QWHZj.pqcbx.cn
http://CntClBXu.pqcbx.cn
http://rhfcG1eW.pqcbx.cn
http://qYgBbB4u.pqcbx.cn
http://7IiDDxZK.pqcbx.cn
http://PcG29wXq.pqcbx.cn
http://u5UztGh2.pqcbx.cn
http://USrkhZ0K.pqcbx.cn
http://FiyVu7lI.pqcbx.cn
http://Qvo50s2U.pqcbx.cn
http://YR8dhIiW.pqcbx.cn
http://PKB8wBuX.pqcbx.cn
http://DVOmVJtI.pqcbx.cn
http://2nlfNLvX.pqcbx.cn
http://G8RK8pEF.pqcbx.cn
http://www.dtcms.com/a/385322.html

相关文章:

  • 数据结构——顺序存储链式存储
  • Vue 脚手架与webpack
  • pytest单元测试框架
  • CentOS7.9绿色安装mysql5.7.44
  • Cell Biology Learning Track(I)膜结构
  • 医院用的桌面管控软件有哪些?适用于医院的桌面管控软件推荐
  • 异步编程三剑客:回调、闭包与Promise组合实战
  • MySQL 主从同步(复制)实战
  • redis面试点记录
  • mysql和postgresql如何选择
  • 电磁兼容性(EMC)法规
  • 【论文笔记】Self-Supervised Point Cloud Prediction for Autonomous Driving
  • MySQL数据库(四)—— 使用MyCat实现MySQL主从读写分离实战指南
  • HTB paper
  • oracle认证有哪几种?如何选择
  • YoloV8改进策略:上采样改进|反卷积|数学上可逆的反卷积」塞进 YOLOv8,涨点不涨参!图像恢复黑科技 Converse2D 的跨界奇袭!
  • springboot netty 服务端网络编程入门与实战
  • 从零开始学AI——15
  • Linux C库函数的可重入与不可重入版本说明
  • ZooKeeper核心知识点总结:分布式系统的“协调者”
  • Unreal故障艺术之RGB颜色分离故障
  • 金融数据---东方财富人气榜-A股
  • 设计模式详解——创建型
  • Java 泛型与通配符全解析
  • Python变量与数据类型全解析:从命名规则到类型转换
  • 了解篇 | StarRocks 是个什么数据库?
  • 风险控制规则引擎:从敏捷开发工具到管理逻辑的承载者
  • 基于Matlab深度学习的植物叶片智能识别系统及其应用
  • AI编程从0-1开发一个小程序
  • Android原生的TextToSpeech,文字合成语音并播放