WebSocket在Java Spring Boot+Vue框架中实现消息推送功能

简介: 在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。

 在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。

一、技术栈

  • 后端:Java Spring Boot
  • 前端:Vue.js
  • WebSocket库:Spring Boot的WebSocket支持,Vue Native WebSocket库

二、后端实现

1. 添加依赖

首先,在Spring Boot项目的pom.xml中添加WebSocket的依赖:

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

image.gif

2. 配置WebSocket

创建一个配置类来启用WebSocket并注册WebSocket处理器:

@Configuration  
@EnableWebSocket  
public class WebSocketConfig implements WebSocketConfigurer {  
  
    @Override  
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {  
        registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*");  
    }  
}

image.gif

3. 实现WebSocket处理器

创建一个WebSocket处理器来处理连接、消息、错误和关闭事件:

@Component  
public class MyWebSocketHandler extends TextWebSocketHandler {  
  
    private static final ConcurrentHashMap<String, WebSocketSession> sessions = new ConcurrentHashMap<>();  
  
    @Override  
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {  
        sessions.put(session.getId(), session);  
        System.out.println("WebSocket session established: " + session.getId());  
    }  
  
    @Override  
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {  
        // 处理接收到的消息  
        System.out.println("Received message: " + message.getPayload());  
    }  
  
    @Override  
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {  
        sessions.remove(session.getId());  
        System.out.println("WebSocket session closed: " + session.getId());  
    }  
  
    // 发送消息到指定客户端  
    public void sendMessageToUser(String sessionId, String message) throws IOException {  
        WebSocketSession session = sessions.get(sessionId);  
        if (session != null && session.isOpen()) {  
            session.sendMessage(new TextMessage(message));  
        }  
    }  
}

image.gif

4. 控制器处理消息推送

创建一个控制器来触发消息推送:

@RestController  
@RequestMapping("/api/message")  
public class MessageController {  
  
    @Autowired  
    private MyWebSocketHandler webSocketHandler;  
  
    @PostMapping("/push")  
    public ResponseEntity<?> pushMessage(@RequestParam String sessionId, @RequestParam String message) {  
        try {  
            webSocketHandler.sendMessageToUser(sessionId, message);  
            return ResponseEntity.ok("Message sent successfully");  
        } catch (IOException e) {  
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to send message");  
        }  
    }  
}

image.gif

三、前端实现

1. 安装Vue Native WebSocket

在Vue项目中安装Vue Native WebSocket库:

npm install vue-native-websocket

image.gif

2. 引入并使用WebSocket

在Vue项目的入口文件(如main.js)中引入并配置WebSocket:

import VueNativeSock from 'vue-native-websocket'  
  
Vue.use(VueNativeSock, 'ws://localhost:8080/ws', {  
    reconnection: true,  
    format: 'json',  
    connectManually: true  
});  
  
new Vue({  
    // Vue实例配置  
});

image.gif

3. 组件中使用WebSocket

在Vue组件中,使用WebSocket来接收消息:

<template>  
  <div>  
    <h1>Messages</h1>  
    <ul>  
      <li v-for="(message, index) in messages" :key="index">{{ message }}</li>  
    </ul>  
  </div>  
</template>  
  
<script>  
export default {  
  data() {  
    return {  
      messages: [] // 用于存储接收到的消息  
    };  
  },  
  mounted() {  
    // 如果需要手动连接WebSocket,可以在这里调用  
    // this.$connect();  
  
    // 监听WebSocket的message事件  
    this.$options.sockets.onmessage = (event) => {  
      // 假设服务器发送的是纯文本消息  
      const message = event.data;  
      // 将新消息添加到messages数组中  
      this.messages.push(message);  
  
      // 如果需要滚动到最新的消息,可以添加如下代码  
      // 注意:这取决于你的页面布局和CSS  
      // this.$nextTick(() => {  
      //   const messagesList = this.$el.querySelector('ul');  
      //   if (messagesList) {  
      //     messagesList.scrollTop = messagesList.scrollHeight;  
      //   }  
      // });  
    };  
  
    // 如果WebSocket是自动连接的,上面的$connect()调用可能是不必要的。  
    // 但是,如果你需要在组件挂载时做一些额外的设置或检查,你可以在这里进行。  
  },  
  beforeDestroy() {  
    // 组件销毁前断开WebSocket连接(如果之前手动连接了的话)  
    // 注意:如果WebSocket是自动管理的(如vue-native-websocket插件),  
    // 这可能不是必需的,因为插件通常会在Vue实例销毁时自动处理。  
    // 但为了完整性,这里还是展示一下如何手动断开连接  
    // this.$disconnect();  
  
    // 移除事件监听器(可选,取决于你是否需要在组件销毁时清理)  
    // this.$options.sockets.offmessage = null;  
    // 注意:vue-native-websocket插件并没有直接提供offmessage这样的方法,  
    // 这里只是为了说明如果需要手动清理事件监听器的概念。  
    // 实际上,你可以通过保存对监听器函数的引用并在需要时调用removeEventListener来实现。  
  }  
};  
</script>  
  
<style scoped>  
/* 你的样式 */  
</style>

image.gif

注意

  1. 在这个例子中,我们假设服务器发送的是纯文本消息,所以直接将event.data添加到messages数组中。如果你的服务器发送的是JSON对象,你需要先解析它(例如,使用JSON.parse(event.data))。
  2. this.$options.sockets.onmessage是一个简化的表示,用于说明如何监听WebSocket消息。然而,vue-native-websocket插件实际上提供了不同的方式来监听消息,通常是通过Vue的sockets选项或在Vue实例上直接监听$socket事件(取决于插件的版本和配置)。因此,请根据你实际使用的插件版本和配置来调整代码。
  3. beforeDestroy生命周期钩子中,我们注释掉了断开WebSocket连接的代码,因为vue-native-websocket插件通常会在Vue实例销毁时自动处理WebSocket连接的关闭。但是,如果你需要手动控制连接的开启和关闭,你可以取消注释相关代码。
  4. 同样地,我们也注释掉了移除事件监听器的代码,因为vue-native-websocket插件会管理这些监听器,并在Vue实例销毁时自动清理它们。但是,如果你以非标准方式添加了事件监听器,你可能需要手动清理它们以避免内存泄漏。
相关文章
|
9月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
664 2
|
12月前
|
NoSQL 安全 Java
2.2k star 单点登录框架揭秘!主流SSO太重?SpringBoot轻量级Smart‑SSO轻松接入·分布式·强踢人
Smart-SSO 是一个基于 SpringBoot 的轻量级单点登录框架,采用 OAuth2 授权码与 RBAC 权限设计,解决跨域认证、单点退出、令牌过期等痛点。支持自动续签、强制踢人、按钮级权限控制及分布式部署,适合中小团队快速构建高可用认证中台。项目已获 2.2k Star,代码开源,接入简单,是企业级应用的理想选择。[详情见 GitHub](https://github.com/a466350665/smart-sso)。
657 23
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
807 7
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
1199 1
|
8月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
740 2
|
XML 前端开发 Java
SpringBoot实现文件上传下载功能
本文介绍了如何使用SpringBoot实现文件上传与下载功能,涵盖配置和代码实现。包括Maven依赖配置(如`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`)、前端HTML页面设计、WebConfig路径映射配置、YAML文件路径设置,以及核心的文件上传(通过`MultipartFile`处理)和下载(利用`ResponseEntity`返回文件流)功能的Java代码实现。文章由Colorful_WP撰写,内容详实,适合开发者学习参考。
1176 0
|
人工智能 前端开发 JavaScript
SpringBoot实现网页消息推送的5种方法
本文详细介绍了在SpringBoot中实现网页消息推送的几种主流方案,包括短轮询、长轮询、SSE(Server-Sent Events)、WebSocket以及STOMP。每种方案各有优缺点,适用于不同的场景需求。短轮询简单易实现但效率低;长轮询提升了实时性但仍有限制;SSE适合单向通信且轻量高效;WebSocket支持全双工通信,适合高实时性要求的场景;STOMP基于WebSocket,提供更高级的消息传递功能。通过对比分析,开发者可根据业务需求、性能要求及浏览器兼容性选择最适合的技术方案,同时可结合多种技术实现优雅降级,优化用户体验。
2202 57
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
721 70
|
11月前
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
1142 1