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

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

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

1 引言

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

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

2 什么是STOMP

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

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

3 创建一个应用程序

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

Spring Boot Starter Websockets

现在,使用一个嵌入式消息代理,它将是一个提供WebSocket功能的内存中代理。给代理添加一些目的地。这些目的地指的是将要发送消息的路径。Rf028资讯网——每日最新资讯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目的地用于向特定用户发送通知。Rf028资讯网——每日最新资讯28at.com

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

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

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

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

为此,首先实现一个控制器,该控制器会把来自一个客户端的信息转发给所有客户端。Rf028资讯网——每日最新资讯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目的地才能到达该处理程序。Rf028资讯网——每日最新资讯28at.com

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

来看看HTML页面上的客户端代码:Rf028资讯网——每日最新资讯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上的消息。Rf028资讯网——每日最新资讯28at.com

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

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

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

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

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

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

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

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

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

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

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

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

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

Spring Boot Starter Security

添加了Spring Security依赖项后,我们需要定义一个安全配置来允许使用WebSockets进行连接。Rf028资讯网——每日最新资讯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"的静态用户。Rf028资讯网——每日最新资讯28at.com

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

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

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

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

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

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

现在,添加一个新的文本块并订阅用户特定的目标。Rf028资讯网——每日最新资讯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));        });    });

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

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

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

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

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

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

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

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

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

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

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

6 结语

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

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

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

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

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
Top