springboot 使用websocket stomp 发送消息

导入依赖

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

配置

package com.qi.demo1.config;

import com.qi.demo1.interceptor.MyChannelInterceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

/**
 * @author qyb
 * @version 1.0
 * @date 2022/7/26-11:34
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
    @Autowired
    MyChannelInterceptor myChannelInterceptor;

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        使用sockjs
//        registry.addEndpoint("/socket")
//                .setAllowedOrigins("*")
//                .withSockJS();
//        使用原生
        registry.addEndpoint("/socket")
                .setAllowedOrigins("*");
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
           registration.interceptors(myChannelInterceptor);
    }



    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {

//         点对点  默认为/user
           registry.setUserDestinationPrefix("/user");
           接收客户端消息前缀
//           registry.setApplicationDestinationPrefixes("/app");

//        //     声明在/user、/topic可以像客户端发送消息   (声明了这个必须加上/user ,不然一对一消息发送不了)
        registry.enableSimpleBroker("/user","/topic");
    }


}

配置客户端入站通道拦截器

用于认证授权,没有登录不能连接

package com.qi.demo1.interceptor;

import com.qi.demo1.entity.AuthUser;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.stereotype.Component;

import java.security.Principal;
import java.util.List;

/**
 * @author qyb
 * @version 1.0
 * @date 2022/7/27-10:28
 */
@Slf4j
@Component
public class MyChannelInterceptor implements ChannelInterceptor {

    @Override
    public Message<?> preSend(@NotNull Message<?> message, @NotNull MessageChannel channel) {
        StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
        StompCommand command = accessor.getCommand();
        if (StompCommand.CONNECT.equals(command)) {
//            认证校验,没有登录的用户不允许连接
            List<String> authorization = accessor.getNativeHeader("Authorization");
            if (authorization != null && authorization.size() > 0) {
                String token = authorization.get(0);
                if (!"123456".equals(token)) {
                    throw new RuntimeException("认证失败");
                }
                accessor.setUser(new AuthUser(token));
                log.info("用户【{}】连接成功", token);
            }
        } else if (StompCommand.DISCONNECT.equals(command)) {
            Principal user = accessor.getUser();
            log.info("用户【{}】断开连接", user);
        }
        System.out.println(message);
        return message;
    }

}

前端代码

import {Client} from '@stomp/stompjs'
export default class WebSocketApi {
	constructor() {
		this.client = new Client({
			brokerURL: 'ws://localhost:8090/socket', //可以不赋值,因为后面用SockJS来代替
			connectHeaders: {
				"Authorization": "123456"
			},
			debug:(msg)=> console.log(msg),
			reconnectDelay: 10000, //重连时间
			heartbeatIncoming: 4000,
			heartbeatOutgoing: 4000,
			//错误
			onStompError: () => console.log('连接失败') //这里不需要重连了,新版自带重连

		})

	}
	connect(url, callback) {
		this.client.onConnect = () => this.client.subscribe(url, callback)
		this.client.activate()
	}
	disConnect() {
		if (this.client != null) this.client.deactivate()
	}
}

前端使用

created() {
			this.websocket=new WebsocketApi()
			this.websocket.connect("/user/123456/message/chat",(res)=>{
				console.log(res.body);
				console.log(111);
			})
		},

后端发送消息的接口

package com.qi.demo1.controller;

import com.qi.demo1.common.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.user.SimpUser;
import org.springframework.messaging.simp.user.SimpUserRegistry;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Set;

/**
 * @author qyb
 * @version 1.0
 * @date 2022/7/27-11:42
 */
@RestController
public class WsController {
    @Autowired
    SimpMessagingTemplate simpMessagingTemplate;
    @Autowired
    SimpUserRegistry simpUserRegistry;

    @GetMapping("/send")
    public R<?> sendToUser(String msg) {
        Set<SimpUser> users = simpUserRegistry.getUsers();
        System.out.println(users);
        simpMessagingTemplate.convertAndSendToUser("123456","/message/chat","123467");
        return R.ok();
    }
}

参考连接 :  springboot中通过stomp方式来处理websocket及token权限鉴权相关   ;

将 STOMP 与 SockJS 一起使用

Spring Websocket+Stomp 防踩坑实战

Spring使用WebSocket、SockJS、STOMP实现消息功能

### 回答1: Spring Boot WebSocket Stomp是一种基于Spring Boot框架的WebSocket协议的实现方式,它可以实现实时通信和消息推送功能。Stomp是一种简单的消息传输协议,它可以在WebSocket之上提供一个可靠的消息传输机制。使用Spring Boot WebSocket Stomp可以轻松地实现WebSocket通信,同时也可以使用Stomp协议来传输消息。这种方式非常适合实现实时通信和消息推送功能,例如在线聊天、实时监控等场景。 ### 回答2: springboot websocket stomp是一种基于Java的开源框架,它可以帮助我们实现实时通信功能。它采用了WebSocket协议作为底层通信协议,并结合了STOMP(Simple Text Oriented Messaging Protocol)协议来进行消息的传输和解析。 使用springboot websocket stomp可以很方便地实现客户端和服务器之间的实时通信,比如聊天室、实时数据展示等功能。它的好处是能够降低开发成本,提高开发效率,同时还可以提供较好的用户体验。 在使用springboot websocket stomp时,首先需要进行相关的配置和依赖,然后在代码中定义好相关的消息处理器,用于处理客户端发送过来的消息和服务器推送的消息。接下来,我们可以使用JS等前端技术来调用WebSocket对象,连接到指定的WebSocket服务端,并发送和接收消息。 在WebSocket连接建立之后,我们可以使用STOMP协议进行消息发送和订阅。我们可以使用STOMP协议中的几个关键命令,比如SEND、SUBSCRIBE、UNSUBSCRIBE等来进行消息发送和订阅操作。 springboot websocket stomp还提供了一些注解,用于标识和定义消息的处理器、消息的目的地等属性。通过这些注解,我们可以很方便地控制消息发送和接收。 总的来说,springboot websocket stomp提供了一种简单且效率高的方式来实现实时通信功能。它的易用性、扩展性和可靠性使得它在实际应用中得到广泛的应用。 ### 回答3: Spring Boot是一种用于简化Spring应用程序开发的框架,它提供了许多便利的功能和自动配置的特性。WebSocket是一种在客户端和服务器之间建立持久连接的协议,它为实时双向通信提供了一个解决方案。Stomp是一种在WebSocket之上建立消息传递协议的简单文本协议。 Spring Boot提供了对WebSocketStomp的支持,使开发人员能够轻松实现实时通信功能。通过使用Spring BootWebSocketStomp支持,可以快速构建具有实时功能的应用程序。 在Spring Boot使用WebSocketStomp,首先需要在pom.xml文件中添加相关依赖。然后,在应用程序的配置类中使用@EnableWebSocketMessageBroker注解启用WebSocketStomp消息代理功能。接下来,使用@MessageMapping注解来定义处理WebSocket消息的方法。 在处理WebSocket消息的方法中,可以使用@SendTo注解将消息发送到指定的目的地,也可以使用SimpMessagingTemplate来主动推送消息给客户端。 另外,还可以使用@SubscribeMapping注解来定义处理订阅请求的方法。通过在订阅请求方法中返回需要订阅的数据,可以在客户端成功订阅后立即将数据发送给客户端。 通过使用Spring BootWebSocketStomp支持,我们可以轻松地实现实时通信功能,使应用程序能够实时传递消息和数据。这对于需要实时更新的应用程序非常有用,如聊天室、股票交易系统等。 总而言之,Spring Boot提供了对WebSocketStomp的支持,使开发人员能够方便地构建具有实时通信功能的应用程序。通过使用WebSocketStomp,我们可以实现实时传递消息和数据的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值