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实例销毁时自动清理它们。但是,如果你以非标准方式添加了事件监听器,你可能需要手动清理它们以避免内存泄漏。
相关文章
|
11月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
733 2
|
11月前
|
监控 Java 数据库
从零学 Dropwizard:手把手搭轻量 Java 微服务,告别 Spring 臃肿
Dropwizard 整合 Jetty、Jersey 等成熟组件,开箱即用,无需复杂配置。轻量高效,启动快,资源占用少,内置监控、健康检查与安全防护,搭配 Docker 部署便捷,是构建生产级 Java 微服务的极简利器。
1081 117
|
10月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
11月前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
5762 58
|
11月前
|
前端开发 安全 Java
基于springboot+vue开发的会议预约管理系统
一个完整的会议预约管理系统,包含前端用户界面、管理后台和后端API服务。 ### 后端 - **框架**: Spring Boot 2.7.18 - **数据库**: MySQL 5.6+ - **ORM**: MyBatis Plus 3.5.3.1 - **安全**: Spring Security + JWT - **Java版本**: Java 11 ### 前端 - **框架**: Vue 3.3.4 - **UI组件**: Element Plus 2.3.8 - **构建工具**: Vite 4.4.5 - **状态管理**: Pinia 2.1.6 - **HTTP客户端
1459 4
基于springboot+vue开发的会议预约管理系统
|
10月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
834 8
|
前端开发 JavaScript Java
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
本系统基于SpringBoot与Vue3开发,实现校园食堂评价功能。前台支持用户注册登录、食堂浏览、菜品查看及评价发布;后台提供食堂、菜品与评价管理模块,支持权限控制与数据维护。技术栈涵盖SpringBoot、MyBatisPlus、Vue3、ElementUI等,适配响应式布局,提供完整源码与数据库脚本,可直接运行部署。
635 6
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
|
12月前
|
前端开发 Java 开发者
Java新手指南:在Spring MVC中使用查询字符串与参数
通过结合实际的需求和业务逻辑,开发者可以灵活地利用这些机制,为用户提供更丰富而高效的Web应用体验。
277 15
|
JSON 前端开发 Java
Java新手指南:如何在Spring MVC中处理请求参数
处理Spring MVC中的请求参数是通过控制器方法中的注解来完成的。这些注解包括 `@RequestParam`, `@PathVariable`, `@ModelAttribute`, `@RequestBody`, `@RequestHeader`, `@Valid`, 和 `@RequestMapping`。使用这些注解可以轻松从HTTP请求中提取所需信息,例如URL参数、表单数据或者JSON请求体,并将其转换成Java对象以供进一步处理。
696 17
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
1083 1