当前位置:首页 > 科技  > 软件

基于Spring Boot,一步步教你用Websockets和STOMP进行消息推送

来源: 责编: 时间:2023-12-21 17:12:18 356观看
导读1 引言推送通知是一种实时消息传递形式,通过它网站可以向用户实时通知特定事件。通常使用WebSockets实现推送通知,这种技术提供了客户端和服务器之间的双向通信,从而实现了实时消息的处理。本文使用WebSockets来实现推送

1 引言

推送通知是一种实时消息传递形式,通过它网站可以向用户实时通知特定事件。通常使用WebSockets实现推送通知,这种技术提供了客户端和服务器之间的双向通信,从而实现了实时消息的处理。5Uj28资讯网——每日最新资讯28at.com

本文使用WebSockets来实现推送通知,并使用STOMP协议在客户端和服务器之间进行通信。5Uj28资讯网——每日最新资讯28at.com

2 什么是STOMP

STOMP代表简单文本导向的消息协议(Simple Text Oriented Messaging Protocol)。由于WebSockets是一种低级协议,使用帧(frames)来传输数据,而STOMP是一种高级协议,定义了如何解释某些帧类型中的数据。这些帧类型包括CONNECT、SEND、ACK等。因此,使用STOMP能够更加简化使用WebSockets进行数据的发送、接收和解析过程。5Uj28资讯网——每日最新资讯28at.com

有了这个基础,接下来创建服务器应用程序。5Uj28资讯网——每日最新资讯28at.com

3 创建一个应用程序

到https://start.spring.io创建一个Spring Boot应用程序,并添加以下依赖项:5Uj28资讯网——每日最新资讯28at.com

Spring Boot Starter Websockets

现在,使用一个嵌入式消息代理,它将是一个提供WebSocket功能的内存中代理。给代理添加一些目的地。这些目的地指的是将要发送消息的路径。5Uj28资讯网——每日最新资讯28at.com

@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer {    @Override    public void configureMessageBroker(MessageBrokerRegistry config) {        config.enableSimpleBroker("/all","/specific");        config.setApplicationDestinationPrefixes("/app");    }    @Override    public void registerStompEndpoints(StompEndpointRegistry registry) {         registry.addEndpoint("/ws");         registry.addEndpoint("/ws").withSockJS();    }}

在第一部分中,启用了一个带有两个目的地(/all和/specific)的代理。/all目的地将用于向所有用户发送通知,/specific目的地用于向特定用户发送通知。5Uj28资讯网——每日最新资讯28at.com

接下来,设置应用程序的目的地,即 /app,这样就可以向应用程序发送信息了。5Uj28资讯网——每日最新资讯28at.com

在第二部分中,注册了STOMP端点。其中一个启用了SockJS,另一个仅使用WebSocket。之所以这样做,是因为并非所有浏览器都支持WebSocket,当不可用时,可以回退到使用SockJS。5Uj28资讯网——每日最新资讯28at.com

4 向所有用户发送推送通知

先看一下第一个用例,即向所有用户发送推送通知。5Uj28资讯网——每日最新资讯28at.com

为此,首先实现一个控制器,该控制器会把来自一个客户端的信息转发给所有客户端。5Uj28资讯网——每日最新资讯28at.com

@org.springframework.stereotype.Controllerpublic class Controller {    @Autowired    SimpMessagingTemplate simpMessagingTemplate;    @MessageMapping("/application")    @SendTo("/all/messages")    public Message send(final Message message) throws Exception {        return message;    }}

在上面的代码中,我们接受/application端点上的消息。这实际上是之前定义的应用程序目的地/app的子目的地。这意味着客户端必须把消息发送到/app/application目的地才能到达该处理程序。5Uj28资讯网——每日最新资讯28at.com

接下来,把传入的消息转发到/all/messages。现在,订阅该目的地的所有客户端都将收到发送给所有客户端的消息。5Uj28资讯网——每日最新资讯28at.com

来看看HTML页面上的客户端代码:5Uj28资讯网——每日最新资讯28at.com

<script type="text/javascript">        var stompClient = null;        var socket = new SockJS('/ws');        stompClient = Stomp.over(socket);        stompClient.connect({}, function(frame) {            console.log(frame);            stompClient.subscribe('/all/messages', function(result) {                show(JSON.parse(result.body));            });        });

在这里,使用一个STOMP客户端,在WebSocket上建立连接,然后订阅/all/messages上的消息。5Uj28资讯网——每日最新资讯28at.com

现在,为了将消息发送给应用程序,有以下的JavaScript函数,它将消息发送到/app/application:5Uj28资讯网——每日最新资讯28at.com

function sendMessage() {    var text = document.getElementById('text').value;    stompClient.send("/app/application", {},      JSON.stringify({'from':from, 'text':text}));}

它简单地从文本字段中获取文本值,并将其发送到代理的应用程序目标。5Uj28资讯网——每日最新资讯28at.com

这是通过下面显示的一个简单表单进行连接的。5Uj28资讯网——每日最新资讯28at.com

图片图片5Uj28资讯网——每日最新资讯28at.com

为了测试这个,我们向所有连接的客户端发送一个推送通知"Notification to all"。5Uj28资讯网——每日最新资讯28at.com

图片图片5Uj28资讯网——每日最新资讯28at.com

这里有两个连接的客户端,两个客户端都立即收到了通知。5Uj28资讯网——每日最新资讯28at.com

现在,在这里只是显示了从WebSocket接收到的内容,但可以根据需要使用CSS和JavaScript来自定义通知弹出窗口或通知标签。5Uj28资讯网——每日最新资讯28at.com

这就是如何向所有用户发送通知。那么如何向特定用户发送通知呢?5Uj28资讯网——每日最新资讯28at.com

5 向特定用户发送推送通知

要向特定用户发送通知,我们需要收件人的用户ID。这意味着接收方用户需要登录并提供一个有效的会话来标识用户的用户ID。5Uj28资讯网——每日最新资讯28at.com

为此,我们将集成Spring Security。因此,添加以下依赖项。5Uj28资讯网——每日最新资讯28at.com

Spring Boot Starter Security

添加了Spring Security依赖项后,我们需要定义一个安全配置来允许使用WebSockets进行连接。5Uj28资讯网——每日最新资讯28at.com

@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {    http            .authorizeHttpRequests()                .mvcMatchers("/","/ws/**")                .permitAll()            .and()            .authorizeHttpRequests()                .anyRequest().authenticated()            .and()            .formLogin()            .and()            .logout( logout -> logout.logoutSuccessUrl("/"));    return http.build();}@Beanpublic InMemoryUserDetailsManager userDetailsService() {    UserDetails user = User.withDefaultPasswordEncoder()            .username("test")            .password("test")            .roles("USER")            .build();    return new InMemoryUserDetailsManager(user);}

在这里,我们允许所有连接到/ws路径的连接,以便在没有任何身份验证的情况下进行WebSocket通信,还定义了一个名为"test"的静态用户。5Uj28资讯网——每日最新资讯28at.com

还记得在上面的消息代理设置中创建的/specific目标吗?现在将使用它来发送特定的消息。5Uj28资讯网——每日最新资讯28at.com

首先,在控制器中添加一个处理程序,用于接收消息并将其发送给特定的用户,这些用户将使用它们的用户名进行标识。5Uj28资讯网——每日最新资讯28at.com

@org.springframework.stereotype.Controllerpublic class Controller {    @Autowired    SimpMessagingTemplate simpMessagingTemplate;    @MessageMapping("/application")    @SendTo("/all/messages")    public Message send(final Message message) throws Exception {        return message;    }    @MessageMapping("/private")    public void sendToSpecificUser(@Payload Message message) {        simpMessagingTemplate.convertAndSendToUser(message.getTo(), "/specific", message);    }}

现在,在sendToSpecificUser方法中,我们接受使用/app/private发送的消息。消息包含要发送给接收者的文本以及接收者的用户ID。5Uj28资讯网——每日最新资讯28at.com

消息模板所做的是将消息发送到以/user开头的目标,然后将其附加到我们在convertAndSendToUser函数调用中指定的目标,即/specific,然后附加所指定的用户的用户会话ID。5Uj28资讯网——每日最新资讯28at.com

因此,convertAndSendToUser将消息发送到目标/user/specific-<user-session-id>。这个目标是在用户登录并订阅/user/specific时创建的。5Uj28资讯网——每日最新资讯28at.com

当用户登录并订阅/user/specific时,它会发送有效的已登录会话ID。然后,Spring自动处理订阅/user/specific将自动订阅已登录用户的特定目标,即/user/specific-<user-session-id>。5Uj28资讯网——每日最新资讯28at.com

这也意味着只有用户登录时才能发送通知。5Uj28资讯网——每日最新资讯28at.com

现在,添加一个新的文本块并订阅用户特定的目标。5Uj28资讯网——每日最新资讯28at.com

socket = new SockJS('/ws');privateStompClient = Stomp.over(socket);privateStompClient.connect({}, function(frame) {        console.log(frame);        privateStompClient.subscribe('/user/specific', function(result) {        console.log(result.body)            show(JSON.parse(result.body));        });    });

图片图片5Uj28资讯网——每日最新资讯28at.com

打开两个客户端,并使用"test"用户登录第二个客户端。可以使用/login端点触发登录。5Uj28资讯网——每日最新资讯28at.com

在上面的图像中,正在以"test"用户登录第二个客户端。5Uj28资讯网——每日最新资讯28at.com

登录后,首先向所有客户端发送消息。5Uj28资讯网——每日最新资讯28at.com

图片图片5Uj28资讯网——每日最新资讯28at.com

所以,即使已登录的用户也会收到发送给所有客户端的通知。5Uj28资讯网——每日最新资讯28at.com

现在,向"test"用户发送一个私有通知。5Uj28资讯网——每日最新资讯28at.com

图片图片5Uj28资讯网——每日最新资讯28at.com

在上面的图像中,我们为特定用户提供了一条消息,并指定了特定用户的用户ID,即"test",通知只会传递给已登录的用户。5Uj28资讯网——每日最新资讯28at.com

这是一个关于它是如何工作的简短演示。5Uj28资讯网——每日最新资讯28at.com

图片图片5Uj28资讯网——每日最新资讯28at.com

6 结语

在本文中,我们学习了如何使用Spring Boot应用程序、WebSockets和STOMP协议发送推送通知。如果希望使用外部的ActiveMQ实例,只需将其连接到应用程序,因为ActiveMQ也支持STOMP协议。这样,我们就可以通过应用程序将消息中继到外部的ActiveMQ实例,实现更灵活和可定制的消息传递。通过这种方式,可以轻松地实现推送通知功能,为用户提供实时的信息更新和交互体验。希望这篇文章对读者有所帮助!5Uj28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-51263-0.html基于Spring Boot,一步步教你用Websockets和STOMP进行消息推送

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 前端 JS 安全对抗原理与实践

下一篇: C++实现链表:原理、代码与解析

标签:
  • 热门焦点
  • 《英雄联盟》夏季赛总决赛今日开打!JDG对阵LNG首发名单来了 Knight:准备三连冠

    8月5日消息,今日17:00,《英雄联盟》2023LPL夏季赛总决赛将正式开打,由JDG对阵LNG。对两支队伍来说,这场比赛不仅要争夺夏季赛冠军,更要决定谁才是LPL赛区一
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 余承东:AI大模型技术的发展将会带来下一代智能终端操作系统的智慧体验

    8月4日消息,2023年华为开发者大会(HDC.Together)今天正式开幕,华为发布HarmonyOS 4、全新升级的鸿蒙开发套件、HarmonyOS Next开发者预览版本等一系列
Top