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日

相关文章

  • SpringBoot 整合mapstruct的实现步骤

    下面是详细讲解“SpringBoot 整合 MapStruct 的实现步骤”的完整攻略。 什么是 MapStruct MapStruct 是一个在编译时期通过注解自动生成 Java Bean 映射代码的框架。它具有简单易用、高效准确等特点,可以大幅度提升 Java Bean 映射的开发效率。 SpringBoot 整合 MapStruct 的实现步骤 步骤一…

    Java 2023年5月20日
    00
  • 详解Java多线程tryLock()方法使用

    详解Java多线程tryLock()方法使用 什么是tryLock()方法 tryLock方法是Java多线程中使用的一种同步锁机制。它尝试获取锁,如果锁可用则获取锁并返回true,如果锁不可用则直接返回false,而不会阻塞等待锁。 tryLock方法的定义为: public boolean tryLock() tryLock方法会试图去获取锁,如果锁已经…

    Java 2023年5月19日
    00
  • centOS7安装jdk1.8的方法

    当我们需要在CentOS 7服务器上安装Java开发工具包(JDK)1.8时,我们可以按照以下步骤进行操作: 步骤一:检查并更新系统包管理器 在开始安装过程前,建议先通过以下命令检查系统中是否已安装其他版本的JDK: java -version 如果输出结果显示当前系统中没有安装任何版本的JDK,则允许继续操作;如果已安装其它版本的JDK,则需要卸载旧版本,…

    Java 2023年5月19日
    00
  • java字符串遍历以及统计字符串中各类字符

    让我来详细讲解一下 Java 字符串遍历以及统计字符串中各类字符的攻略。 什么是字符串 在 Java 中,字符串是一个由零个或多个字符组成的对象。Java 中的字符串类型是 String,可以用来表示文本内容。字符串可用于存储、比较、格式化和输出文本等各种用途。 字符串的遍历 字符串的遍历是指按照顺序依次访问字符串中的每一个字符。Java 中字符串的遍历通常…

    Java 2023年5月26日
    00
  • springboot启动后卡住无日志的几种情况小结

    下面是关于“SpringBoot启动后卡住无日志的几种情况小结”完整攻略: 问题背景 在使用SpringBoot开发JavaWeb应用时,有时候可能会遇到启动后卡住无日志的情况,导致我们无法知道整个启动过程的具体信息。这种情况通常有以下几种原因: 应用启动卡在某个点,等待某个线程执行完成 应用启动时出现了未捕获的异常 应用启动时依赖的外部服务出现了故障 接下…

    Java 2023年6月2日
    00
  • JSP针对XML文件操作技巧实例分析

    JSP针对XML文件操作技巧实例分析 简介 JSP是一种动态网页开发技术,它允许将Java代码和特定的标记插入到HTML、XML或其他类型的文档中,从而实现动态内容的生成。XML是一种标记语言,被广泛用于数据存储和传输。JSP可以灵活地处理XML文件,充分发挥它的特点。本文将详细讨论JSP针对XML文件的操作技巧。 XML文件的读取和解析 XML文件由标记和…

    Java 2023年6月15日
    00
  • 浅谈SpringSecurity基本原理

    浅谈SpringSecurity基本原理 什么是SpringSecurity SpringSecurity是一个基于Spring框架的安全框架,它提供了完善的认证(authentication)和授权(authorization)机制,可用于保护Web应用程序中的敏感资源。 SpringSecurity的基本原理 SpringSecurity的主要组件 Sp…

    Java 2023年5月20日
    00
  • nginx配置proxy_pass中url末尾带/与不带/的区别详解

    下面是关于nginx配置proxy_pass中url末尾带/与不带/的区别的详细攻略: 1.问题背景 在nginx配置代理(proxy_pass)时,url末尾带/与不带/有什么区别?在哪种情况下该使用哪种方式呢?本篇攻略将针对这一问题做详细的解答。 2.区别详解 2.1 url末尾带/ 当使用url末尾带/的方式,如下所示: location /abc/ …

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