SpringBoot集成WebSokcet

SpringBoot集成WebSokcet
✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨



这里有:

硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!





👉 点击直达→ 盹猫猫的个人小站 👈
🌟 来逛逛吧,说不定能挖到你正在找的技术宝藏哦~

目录

⭐ 前言

🔷 什么是websocket?

⭐ 环境准备

⭐ 代码步骤

🔷 配置websocket节点

🔷 创建Websocket节点

🔷 授权验证

⭕ 总结


欢迎来到 盹猫(>^ω^<)的博客



本篇文章主要介绍了

[SpringBoot集成WebSokcet]
❤博主广交技术好友,喜欢文章的可以关注一下❤

⭐ 前言

       在Web开发时,有时我们需要一些实时性比较高的数据反馈,如设备监测、系统监测、聊天等,这时使用HTTP显然是不适合的,这时就需要用到WebSocket通过单次连接来获取长时间的数据获取。

🔷 什么是websocket?

        WebSocket 是一种在单个 TCP 连接上实现全双工(双向)通信的网络协议,由 HTML5 规范定义,旨在它允许客户端(如浏览器)和服务器之间建立持久连接,双方可以随时向对方发送数据,而无需像 HTTP 那样每次通信都重新建立连接。

本篇文章就是记录SpringBoot如何集成WebSocket功能,废话不多说,让我们开始吧~

Let's GO!

⭐ 环境准备

        因为要使用websocket,所以在除了集成基础的spring-boot-starter-web 依赖以外,还要集成

spring-boot-starter-websocket 以获得Websocket支持。

Pom.xml

<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!--Web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--WebSocket依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>2.3.12.RELEASE</version> </dependency> </dependencies>

⭐ 代码步骤

🔷 配置websocket节点

        在配置类里,我们需要新建一个ServerEndpointExporter 并交给SpringBoot管理,即可开启WebSocket节点功能,内容如下:

@Configuration public class WebSocketConfig { /** * 注入ServerEndpointExporter, * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }

🔷 创建Websocket节点

        首先需要在需使用到的WebSocket类上添加@ServerEndpoint(path,config) 以标记该类会作为一个websokcet的节点类,其中

  • path:该节点的访问路径
  • config: 可以做一些额外配置,如该节点的访问权限校验。

如下:

@Component @Slf4j @ServerEndpoint(value = "/detail", configurator = WebSocketAuthConfig.class) public class DetailServer {}

下面就可以在该类中以事件标注的方式定义我们的方法,可以使用以下注解:

  • @OnOpen :在有新的连接接入时,触发方法。
  • @OnMessage: 当有新的消息时,触发方法。
  • @OnError:当发生错误时,触发方法。
  • @OnClose:当连接断开时,触发方法。

例如下面的方法定义:

 @OnOpen public void onOpen(Session session) { //这里一般会存储会话。 log.info("【websocket消息】有新的连接"); } /** * 链接关闭调用的方法 */ @OnClose public void onClose() { //这里会移除会话。 log.info("【websocket消息】连接断开"); } @OnMessage public void onMessage(String message) { log.info("【websocket消息】收到客户端消息:" + message); } @OnError public void onError(Session session, Throwable error) { log.error("用户错误,原因:" + error.getMessage()); }

一般会创建一个用于存储当前当前Session的Map,用于会话的管理,并可以通过

session.getAsyncRemote().sendText(message);

将message数据发送到已连接的前端页面。

🔷 授权验证

        当然不能允许所有人连接我们定义的WebSokcet节点,我们可以通过继承ServerEndpointConfig.Configurator 来对节点进行配置,一般可以用于添加请求配置或进行授权认证,如下实现了一个Jwt的token验证:

@Slf4j public class WebSocketAuthConfig extends ServerEndpointConfig.Configurator { /** * DES:[拦截websocket的请求头,并验证] * * @param originHeaderValue 请求头 * @return boolean * @link [java.lang.String] */ @Override public boolean checkOrigin(final String originHeaderValue) { final ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); try { assert servletRequestAttributes != null; /* 此处使用反射的方式获取对象,无法@AutoWiredW自动注入 */ final JwtUtil jwtUtil = SpringUtil.getBean(JwtUtil.class); HttpServletResponse response = servletRequestAttributes.getResponse(); HttpServletRequest request = servletRequestAttributes.getRequest(); //获取并验证请求参数中的token参数 final String token = servletRequestAttributes.getRequest().getParameter("token"); final Claims claims = jwtUtil.getClaimsByToken(token); if (ObjectUtil.isNull(claims)) { /* Token验证失败,拒绝链接 */ log.info("Token错误,拒绝连接......"); request.getSession().setAttribute("loginFill",true); return false; }else { request.getSession().setAttribute("loginFill",false); } } catch (final Exception e) { log.error("WebSocket-auth-error", e); } return true; } }

当然这里也可以通过Shiro的根据路径配置拦截请求,这里也是支持的,这样ServerEndpointConfig.Configurator就可以不用单独配置。

⭕ 总结

        通过上述方式,就可以建立一个比较完善的WebSocket节点,在实际开发过程中可以解决一些实时性要求较高的数据传输。当然,实现WebSocket并不只是有这一种方式,也可以通过Netty框架去自己实现,这样在高并发系统下的效率会更高。

上面就是所有文章内容了,如果内容对你有帮助,麻烦留一个赞👍和收藏⭐支持一下!


如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链

感谢您的关注和收藏!!!!!!

Read more

Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华Prediction with Action详解)

Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华Prediction with Action详解)

前言 本文最开始属于此文《视频生成Sora的全面解析:从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等》 但考虑到DiT除了广泛应用于视频生成领域中,在机器人动作预测也被运用的越来越多,加之DiT确实是一个比较大的创新,影响力大,故独立成本文 第一部分 Diffusion Transformer(DiT):将扩散过程中的U-Net 换成ViT 1.1 什么是DiT 1.1.1 DiT:在VAE框架之下扩散去噪中的卷积架构换成Transformer架构 在ViT之前,图像领域基本是CNN的天下,包括扩散过程中的噪声估计器所用的U-net也是卷积架构,但随着ViT的横空出世,人们自然而然开始考虑这个噪声估计器可否用Transformer架构来代替 2022年12月,William Peebles(当时在UC Berkeley,Peebles在𝕏上用昵称Bill,在Linkedin上及论文署名时用大名William)、Saining Xie(当时在纽约大学)的两人通过论文《Scalable Diffusion Models with Trans

Neo4j-Desktop2.0安装教程(更改安装路径)

Neo4j-Desktop2.0安装教程(更改安装路径)

引言        由于neo4j-desktop2.0版本是不提供安装页面(默认安装在C盘),从而让你选择安装路径的,这对于C盘内存来说是灾难性的。因此,需要手动设置安装路径。 参考文献: 1. https://zhuanlan.zhihu.com/p/1935104156433121644https://zhuanlan.zhihu.com/p/1935104156433121644 2. https://blog.ZEEKLOG.net/WMXJY/article/details/150649084 安装包下载:https://neo4j.com/deployment-center/?desktop-gdbhttps://neo4j.com/deployment-center/?desktop-gdb 1文件夹创建及环境变量设置     首先需要在C盘以外的位置先创建一个Neo4j2文件夹,再在下面创建两个文件夹:App,PROData来存放软件本体和相关数据 然后打开“高级系统设置”——“环境变量”——系统变量下方的“新建”

Flutter 三方库 angular_bloc 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致响应、工业级的 AngularDart 与 BLoC 协同架构实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 angular_bloc 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致响应、工业级的 AngularDart 与 BLoC 协同架构实战 在鸿蒙(OpenHarmony)系统的桌面级协同(如分布式办公网页版)、后台管理终端或高度复杂的 Web 仪表盘开发中,如何将经典的 BLoC 状态管理应用于 AngularDart 环境?angular_bloc 为开发者提供了一套天衣无缝的组件化连接器。本文将实战演示其在鸿蒙 Web 生态中的深度应用。 前言 什么是 Angular BLoC?它是一套专门为 AngularDart 框架设计的 BLoC 实现。通过指令(Directives)和管道(Pipes),它实现了由于数据流变化触发的 UI

MK米客方德SD NAND:无人机存储的高效解决方案

MK米客方德SD NAND:无人机存储的高效解决方案

在无人机技术迅猛发展的当下,飞控系统的数据记录对于飞行性能剖析、故障排查以及飞行安全保障极为关键。以往,SD 卡是飞控 LOG 记录常见的存储介质,但随着技术的革新,新的存储方案不断涌现。本文聚焦于以 ESP32 芯片为主控制器的无人机,创新性采用 SD NAND 芯片 MKDV32GCL-STPA 芯片进行 SD NAND 存储,测试其在飞控 LOG 记录功能中的表现。 米客方德 SD NAND 芯片特性 免驱动优势:与普通存储设备不同,在该应用场景下,SD NAND 无需编写复杂的驱动程序。这极大地简化了开发流程,缩短了开发周期,减少了潜在的驱动兼容性问题,让开发者能够更专注于实现核心功能。 自带坏块管理功能:存储设备出现坏块难以避免,而 MKDV32GCL - STPA 芯片自带的坏块管理机制可自动检测并处理坏块。这确保了数据存储的可靠性,避免因坏块导致的数据丢失或错误写入,提升了整个存储系统的稳定性。 尺寸小巧与强兼容性: