基于Vue3和SpringBoot实现Web实时消息推送功能

 更新时间:2025年05月22日 10:06:15   作者:知否技术  
这篇文章主要介绍了WebSocket实现实时通信,对比HTTP低效,通过SpringBoot+Vue整合实现消息推送,涵盖聊天、股票等场景,文中有详细的代码示例供大家参考,需要的朋友可以参考下

前言

先看演示效果:后端发送消息,前端实时展示

1. WebSocket

WebSocket 是一种常用的实现 web 实时消息推送的技术。

我们先看**传统网站(HTTP)**的缺点:

假设你打开一个股票网站,网页会反复问服务器:“股价变了吗?”(刷新请求) → 服务器:“没变”(响应)... 过2秒网页又问:“变了吗?”... 服务器:“涨了!”

这就像你每隔2秒就打电话问朋友:“有消息吗?” —— 效率低、费流量、延迟高。

WebSocket 是什么?

可以理解为你和服务器开了一个“专线通话”:

  • 首次连接时,用HTTP协议握手(打个招呼建立连接)

  • 连接保持不中断,服务器可以随时主动给你发消息,你也能随时发消息给服务器

  • 实时双向通信,不再需要反复问“有消息吗?”

  • 就像你和朋友微信语音通话,接通后双方随时都能说话,不用挂断重拨。

实际场景:

  • 聊天软件(微信、钉钉):消息秒达,不用刷新页面

  • 股票实时行情:股价变动立即推送到你屏幕

  • 协同编辑(如腾讯文档):多人编辑时内容实时同步

2. 环境搭建

在 Spring Boot 与 Vue 整合 WebSocket 消息通知的场景中,通常Spring Boot 项目作为服务端,而 Vue 项目作为客户端。这种架构设计的原因如下:

  • Spring Boot(服务端):负责消息处理、业务逻辑、数据持久化,以及与 WebSocket 客户端的连接管理。

  • Vue(客户端):通过浏览器提供用户界面,并使用 JavaScript 的 WebSocket API 连接到服务端,接收和展示消息。

2.1 Vue 项目

在 Vue 项目中,我们使用 sockjs-client 和 stomp.js 库来连接 WebSocket。

npm install sockjs-client stompjs

创建 websocket.js

import SockJS from "sockjs-client/dist/sockjs";
import Stomp from "stompjs";

let stompClient = null;

// 连接
export function connectWebSocket(type, notifyCallback, listRefreshCallback) {
  const socket = new SockJS("http://localhost:8083/zhifou-blog/ws-notification");
  stompClient = Stomp.over(socket);

  stompClient.connect({}, () => {
    // 订阅新订单
    if (type === "new-orders") {
      stompClient.subscribe("/topic/new-orders", (message) => {
        notifyCallback(message.body);
        listRefreshCallback();
      });
    }
    if (type === "return-orders") {
      // 订阅退单
      stompClient.subscribe("/topic/return-orders", (message) => {
        notifyCallback(message.body);
        listRefreshCallback();
      });
    }
  });
}

// 关闭连接
export function disconnectWebSocket() {
  if (stompClient !== null) {
    stompClient.disconnect();
  }
}

2.2 SpringBoot 项目

添加依赖

<!-- websocket -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

WebSocket 配置类

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws-notification")
                .setAllowedOriginPatterns("*")// 允许跨域
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 客户端订阅路径前缀
        registry.enableSimpleBroker("/topic");
        // 客户端发送消息的路径前缀
        registry.setApplicationDestinationPrefixes("/app");
    }

}

3. 核心代码

3.1 后端

// 注入依赖
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
// 发送消息
simpMessagingTemplate.convertAndSend("/topic/new-orders"",orderNumber);
// 向特定客户发送消息
simpMessagingTemplate.convertAndSendToUser(userId, "/topic/notification", notification);

3.2 前端

import { onMounted, onBeforeUnmount, reactive, ref } from "vue";
import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
import { connectWebSocket, disconnectWebSocket } from "../../../utils/websocket";
// Dom 挂载之后
onMounted(() => {
  // websocket链接
  connectWebSocket(
    "new-orders",
    (message) => {
      showNotification(message);
    },
    getOrderList
  );
});
// showNotification
const showNotification = (message) => {
  ElNotification({
    title: "新的订单",
    type: "success",
    message: message,
  });
};

onBeforeUnmount(() => {
  disconnectWebSocket();
});

前端页面显示连接成功

以上就是基于Vue3和SpringBoot实现Web实时消息推送功能的详细内容,更多关于Vue3 SpringBoot Web消息推送的资料请关注脚本之家其它相关文章!

相关文章

  • 解决echarts数据二次渲染不成功的问题

    解决echarts数据二次渲染不成功的问题

    这篇文章主要介绍了解决echarts数据二次渲染不成功的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 使用Element-UI的NavMenu如何隐藏自带的小箭头

    使用Element-UI的NavMenu如何隐藏自带的小箭头

    这篇文章主要介绍了使用Element-UI的NavMenu如何隐藏自带的小箭头问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • vue项目中使用hls.js播放m3u8视频踩过的坑小结

    vue项目中使用hls.js播放m3u8视频踩过的坑小结

    hls.js是一个用于在浏览器中播放HLS(HTTP Live Streaming)视频流的JavaScript库,这篇文章主要介绍了vue项目中使用hls.js播放m3u8视频踩过坑的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • Vue transition实现点赞动画效果的示例

    Vue transition实现点赞动画效果的示例

    点赞动画是网页评论中常见的功能,本文将介绍如何用vue实现这一效果。点赞时爱心缩小变大,变大时略微大一点再变正常,取消点赞时爱心无动画,同时数字滚动,+1 时向上滚动,-1 时向下滚动
    2021-05-05
  • VuePress 中如何增加用户登录功能

    VuePress 中如何增加用户登录功能

    VuePress 由两部分组成:一个以 Vue 驱动的主题系统的简约静态网站生成工具,和一个为编写技术文档而优化的默认主题。它是为了支持 Vue 子项目的文档需求而创建的
    2019-11-11
  • Vue中Object.defineProperty用法示例

    Vue中Object.defineProperty用法示例

    Vue中的Object.defineProperty是一个比较重要的方法,它是可以定义对象中属性的一个方法,相比于在对象中直接定义的对象,它更具有灵活性,本文将通过代码示例给大家简单介绍一下Vue中的Object.defineProperty,需要的朋友可以参考下
    2023-08-08
  • vue3的setup语法糖简单封装ckediter的过程

    vue3的setup语法糖简单封装ckediter的过程

    Vue3官方提供了 script setup 语法糖,只需在script标签中添加setup,组件只需引入不用注册,属性和方法也不用返回,今天通过本文给大家分享vue3的setup语法糖简单封装ckediter的过程,感兴趣的朋友一起看看吧
    2023-10-10
  • vue 的 solt 子组件过滤过程解析

    vue 的 solt 子组件过滤过程解析

    这篇文章主要介绍了vue 的 solt 子组件过滤过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 详解VueJs中的V-bind指令

    详解VueJs中的V-bind指令

    v-bind 主要用于属性绑定,比方你的class属性,style属性,value属性,href属性等等,只要是属性,就可以用v-bind指令进行绑定.这篇文章主要介绍了VueJs中的V-bind指令,需要的朋友可以参考下
    2018-05-05
  • vue2.0父子组件间传递数据的方法

    vue2.0父子组件间传递数据的方法

    本文通过一个小例子给大家介绍了vue2.0父子组件间传递数据的方法,需要的朋友参考下吧
    2018-08-08

最新评论