Spring Boot 使用 SSE 方式向前端推送数据详解

Spring Boot 使用 SSE 方式向前端推送数据详解

概述

Server-Sent Events (SSE) 是一种基于 HTTP 协议的服务器推送技术,可以将服务器端的实时数据流推送给客户端,常用于构建实时通讯、监控等场景。Spring Boot 提供了很好的支持,可以方便地将 SSE 技术应用于开发中。

步骤

1. 添加依赖

在 pom.xml 文件中添加如下依赖:

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

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

第一个依赖是 Spring Boot Web 的基础依赖,第二个依赖是 Spring Boot WebFlux 支持 SSE 的依赖。

2. 建立 Controller

在 Spring Boot 项目的 Controller 层中添加 SSE 支持,示例如下:

@RestController
@RequestMapping("/sse")
public class SseController {
    @GetMapping(value = "/event")
    public Flux<ServerSentEvent<String>> getEvent(){
        return Flux.interval(Duration.ofSeconds(1))
                .map(e-> ServerSentEvent.builder(e.toString()).build());
    }
}

在 Controller 中,使用 @GetMapping 注解进行请求映射,并使用 FluxServerSentEvent 类型进行数据流的定义。在上述示例中,每隔 1 秒钟就会向前端推送一个 ServerSentEvent 事件,其中的数据为 0, 1, 2 ... 以此类推。

3. 前端接收 SSE 数据

在前端,我们可以使用 EventSource 进行 SSE 数据的监听和接收,示例如下:

var eventSource = new EventSource("/sse/event");

eventSource.onmessage = function(event) {
    console.log("接收到数据:" + event.data);
}

在前端中,我们创建了一个 EventSource 对象,并将请求地址设置为 "/sse/event",这和上文 Controller 层中 @GetMapping 中的请求映射相匹配。之后,在 EventSource 对象的 onmessage 回调函数中,我们可以获取到推送过来的数据,这里只是简单地将数据打印在控制台中。实际情况中,我们可以根据需要对数据做进一步处理,如实时更新界面等。

示例

以下是一个完整的 Spring Boot SSE 技术的例子:

@RestController
@RequestMapping("/sse")
public class SseController {
    @GetMapping(value = "/event")
    public Flux<ServerSentEvent<String>> getEvent(){
        Random random = new Random();
        return Flux.interval(Duration.ofSeconds(1))
                .map(e-> ServerSentEvent.builder("随机数据:" + random.nextInt(100)).build());
    }
}

上述示例中,我们在数据流中每隔 1 秒钟推送一个 ServerSentEvent 对象,其中包含一个 0-100 之间的随机数。前端代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Spring Boot SSE 示例</title>
</head>
<body>
<div>
    <button onclick="start()">开始接收数据</button>
    <button onclick="close()">停止接收数据</button>
    <p id="data"></p>
</div>

<script type="text/javascript">
    var eventSource = null;

    function start() {
        eventSource = new EventSource("/sse/event");

        eventSource.onmessage = function (event) {
            document.getElementById("data").innerHTML = event.data;
        }
    }

    function close() {
        eventSource.close();
    }
</script>
</body>
</html>

在浏览器中打开该页面后,点击“开始接收数据”按钮,就可以开始接收从后端推送过来的随机数据了。在点击“停止接收数据”按钮后,EventSource 对象会被销毁,停止接收数据。

总结

本文主要介绍了 Spring Boot 中使用 Server-Sent Events (SSE) 技术向前端推送数据的详细步骤,包括添加依赖、建立 Controller 和前端接收 SSE 数据的示例。为了更好地理解 SSE 技术,我们 also 补充了一个完整的 Spring Boot 示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 使用 SSE 方式向前端推送数据详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 修改request的parameter的几种方式总结

    让我来为你详细讲解一下“修改request的parameter的几种方式总结”的攻略。 1. 使用@RequestParam注解 @RequestParam 是 Spring MVC 中用于绑定请求参数的注解之一,可以将请求中特定名称的参数绑定到控制器处理方法的参数上。它可以将请求参数转换为指定的 Java 类型,如String、Integer、Boolea…

    Java 2023年5月20日
    00
  • AOT的作用是什么?

    当谈到AOT时,我们通常指的是AoT编译,即Ahead-of-Time编译技术。以下是AOT的作用以及如何使用它的完整攻略。 AOT的作用 AOT编译技术是指在应用程序部署之前,将应用程序的代码转换成本地可执行代码的过程。AOT的主要作用在于: 提高应用程序的性能:与JIT(Just-in-Time)编译器相比,AOT编译器将应用程序的代码在部署时即转换成本…

    Java 2023年5月11日
    00
  • 解决json字符串序列化后的顺序问题

    关于“解决json字符串序列化后的顺序问题”的问题,我们可以通过以下方法来解决: 方法一:使用有序字典(OrderedDict)进行序列化 在Python的json库中,有序字典(OrderedDict)可以帮助我们保持json字符串序列化后的顺序。在使用json.dumps()方法进行序列化时,我们可以传入参数sort_keys=False,并在json.…

    Java 2023年5月26日
    00
  • Java 多线程实例详解(二)

    Java 多线程实例详解(二) 本文是Java多线程实例系列的第二篇,将进一步介绍Java多线程的实现方式以及相关应用的代码实例。 线程的生命周期 Java线程有5种状态: 新建状态(New):当线程被创建时,它处于新建状态。 就绪状态(Runnable):线程获得了CPU资源,并可以执行,但它还未开始执行它的代码。 运行状态(Running):线程正在执行…

    Java 2023年5月19日
    00
  • 基于SpringBoot与Mybatis实现SpringMVC Web项目

    简介 SpringBoot是一个基于Spring框架的快速开发框架,而Mybatis是一个优秀的持久层框架。将它们整合在一起,可以方便地实现Web应用程序的开发。本文将介绍如何使用SpringBoot整合Mybatis,并提供两个示例说明。 环境建 在开始之前,我们需要先搭建好开发环境。以下是环境搭建的步骤: 安装Java JDK和Maven。 创建一个Sp…

    Java 2023年5月17日
    00
  • JavaScript中String和StringBuffer的速度之争

    JavaScript中的String和StringBuffer都是用于处理字符串的对象,但在性能上存在巨大差异。String对象是不可变的,每次操作都会生成一个新的实例,而StringBuffer对象是可变的,可以直接修改,避免了生成新实例的开销,在字符串拼接时具有较高的效率。 下面我们使用两个示例来说明它们的速度之争: 首先是使用String进行字符串拼接…

    Java 2023年5月27日
    00
  • Window下安装JDK1.8+Tomcat9.0.27+Mysql5.7.28的教程图解

    下面我将详细讲解“Window下安装JDK1.8+Tomcat9.0.27+Mysql5.7.28的教程图解”的完整攻略。 前置要求 在安装这三个软件之前,需要先确定你的电脑已经满足以下几个前置要求: 操作系统:Windows 7/8/10 硬件配置:2GB 以上内存,至少 3GB 的硬盘空间 网络环境:需要能够联网,方便软件下载和安装 JDK1.8 的安装…

    Java 2023年6月2日
    00
  • java多线程编程制作电子时钟

    Java 多线程电子时钟制作攻略 一、准备工作 在开始制作电子时钟之前,需要完成以下准备工作: 安装并配置 Java 开发环境。 了解 Java 多线程编程的基本原理和语法。 二、电子时钟的制作步骤 1.定义一个继承 Runnable 接口的类,并实现 run() 方法。在此方法内编写时钟新增一个秒钟和输出时间的方法。 示例代码如下: class Clock…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部