在Spring Boot 2.7中基于Stomp使用WebSocket与Vue2实现通信

本文详细介绍了如何在Vue.js2.x中通过WebSocket与SpringBoot2.7结合,使用STOMP协议进行通信,包括SpringBoot配置WebSocket支持、Vue.js中的vue-stomp集成以及处理跨域问题的解决方案。
摘要由CSDN通过智能技术生成

前言:近期在研究远程遥控空调,需要通过接口记录前端的一些动作,那么前端需要实现主动通知接口,并接收来自接口的通知。

一、方案

通过在Vue.js 2.x 中使用 WebSocket 与 Spring Boot 2.7 实现通信,使用 STOMP(Simple Text Oriented Messaging Protocol)作为 WebSocket 子协议,并使用 vue-stomp 库来在 Vue.js 中管理 WebSocket 连接。

二、具体实现

1、 Spring Boot 设置 WebSocket 支持

1.1、添加依赖

在 Spring Boot 项目的 pom.xml 文件中添加 WebSocket 依赖。

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-websocket</artifactId>
   <version>${spring-boot.version}</version>
</dependency>

 1.2、配置 WebSocket

在 Spring Boot 应用程序中配置 WebSocket 支持,通常需要创建一个配置类并启用 WebSocket

package com.example.tool.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket")
                //允许websocket跨域
                .setAllowedOriginPatterns("*")
                //启用websocket备选方案(浏览器不支持的话就会启动)
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic"); // 订阅的消息前缀
        registry.setApplicationDestinationPrefixes("/app"); // 应用请求的前缀
    }
}

1.3、处理 WebSocket消息的类

package com.example.tool.controller;

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class MyWebSocketController {
    @MessageMapping("/sendMessage") // 处理客户端发送到 "/app/sendMessage" 的消息
    @SendTo("/topic/messages") // 将处理后的消息广播到 "/topic/messages"
    public String handleMessage(String message) {
        // 你可以在这里处理收到的消息,比如添加时间戳、记录日志等
        return "Received: " + message;
    }
}

2、Vue.js 使用 vue-stomp

2.1、添加依赖

npm install sockjs-client stompjs

2.2、 代码示例

import SockJS from 'sockjs-client';
import Stomp from 'stompjs';

// 在这里继续使用 SockJS 和 Stomp 来创建 WebSocket 连接和实现 STOMP 协议的功能
// 创建 SockJS 连接
const socket = new SockJS('http://localhost:8080/websocket');

// 创建 Stomp 客户端
const stompClient = Stomp.over(socket);

// 连接 Stomp 客户端
stompClient.connect({}, (frame) => {
    console.log('Connected: ' + frame);
    
    // 订阅消息
    stompClient.subscribe('/topic/messages', (message) => {
        console.log('Received message: ' + message.body);
        // 在这里处理接收到的消息,例如更新 UI
    });
}, (error) => {
    console.error('Error connecting to WebSocket: ' + error);
});

// 发送消息
const sendMessage = (message) => {
    stompClient.send('/app/sendMessage', {}, JSON.stringify({ content: message }));
};

// 断开连接
const disconnect = () => {
    if (stompClient !== null) {
        stompClient.disconnect();
    }
    console.log('Disconnected');
};

3、测试

在运行java项目后,直接访问:http://localhost:8088/websocket。应该是返回

在前端访问vue项目,成功应该返回:

接口响应:

{"entropy":909984842,"origins":["*:*"],"cookie_needed":true,"websocket":true}

三、可能遇见的问题

1、没有开启websocket跨域

很多人会没有开启跨域会出现以下错误:Whoops! Lost connection to http://localhost:8088/websocket

我们要做的是在SpringBoot2.7中WebSocketConfig配置类中开启websocket跨域:

setAllowedOriginPatterns("*")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值