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

国产七大AI模型哪家强?DeepSeek、豆包、Kimi、智谱清言、通义千问深度解析!

国产七大AI模型哪家强?DeepSeek、豆包、Kimi、智谱清言、通义千问深度解析!

全球AI竞赛激烈,国内AI领域也进入白热化阶段。 Kimi、智谱清言、通义千问、文心一言、豆包、天工AI、讯飞星火这七款模型,在长文本处理、多模态交互、行业应用等赛道各展所能,竞争激烈。 下面,我们来详细梳理它们的优势与不足,帮你找到最适合的AI助手。 七款大模型实力盘点 1、 Kimi(月之暗面) 长处 处理长文档能力极为出色,能支持长达20万字的文本。面对长篇学术著作、复杂法律条文和冗长项目报告,它都能精准梳理,通过强大的上下文理解能力,把握整体逻辑与细节,在文献解析和知识推理方面实力超群。 * 学术研究人员借助Kimi,可快速梳理海量文献,提炼关键信息,助力论文撰写与研究思路搭建; * 法律从业者使用它,能在短时间内完成大量合同、法规的筛查,精准定位风险点。 不足 * 多模态功能有所欠缺,处理图片、音频等非文本信息时表现欠佳; * 实时信息更新不够及时,难以满足对信息及时性要求高的场景; * 在专业领域,术语库不够丰富,回答特定专业问题时精准度有待提高。 (图源:https://kimi.moonshot.

AI的提示词专栏:Instruction Tuning 与自定义指令集

AI的提示词专栏:Instruction Tuning 与自定义指令集

AI的提示词专栏:Instruction Tuning 与自定义指令集 本文围绕 Instruction Tuning(指令微调)与自定义指令集展开深入解析,先阐释 Instruction Tuning 的定义、与传统 Prompt 调优的区别及核心价值,指出其通过 “指令 - 响应” 对训练让模型从通用文本生成转向精准执行任务,解决传统 Prompt 调优痛点。接着详解自定义指令集的构成要素与设计原则,给出多领域示例。随后介绍 Instruction Tuning 从数据准备、模型选择、微调训练、效果评估到部署应用的完整实施流程,结合电商客服场景实战案例说明落地要点。还针对数据不足、过拟合等常见问题提供解决方案,最后总结核心内容并展望自动指令集生成等未来趋势,为相关实践提供全面指导。 人工智能专栏介绍     人工智能学习合集专栏是 AI 学习者的实用工具。它像一个全面的 AI 知识库,把提示词设计、AI 创作、智能绘图等多个细分领域的知识整合起来。无论你是刚接触

openclaw-termux:把 OpenClaw AI Gateway 装进 Android(带 App、终端和仪表盘)

openclaw-termux:把 OpenClaw AI Gateway 装进 Android(带 App、终端和仪表盘)

openclaw-termux:把 OpenClaw AI Gateway 装进 Android(带 App、终端和仪表盘) 项目地址:https://github.com/mithun50/openclaw-termux 作者同时提供两种使用形态:Standalone Flutter App(推荐给大多数人) + Termux CLI 包(适合命令行党)。 一句话:它让你在不 root 的 Android 设备上,一键搭起 OpenClaw AI Gateway,并通过原生 UI 管理启动、日志、Provider 配置,甚至 SSH 远程连接。 这项目解决了什么问题? OpenClaw 本身是一个 AI Gateway/代理网关:

Qoder AI 编程全攻略:从安装到实战,小白也能轻松上手

Qoder AI 编程全攻略:从安装到实战,小白也能轻松上手

前言 还在觉得 AI 编程只是简单的代码补全?那你一定要试试Qoder!这款面向真实软件开发的 Agentic 编码平台,可不是普通的 AI 代码工具,它能深度理解你的整个代码库,把复杂的开发工作拆解开自动处理,不管是在 IDE 里无缝开发,还是在终端里高效操作,都能让你写代码的效率翻倍。 本文结合 Qoder 官方文档和实际使用经验,用最通俗的语言讲清 Qoder 的核心功能、安装步骤和实战用法,不管你是刚接触 AI 编程的新手,还是想提升开发效率的老程序员,都能轻松看懂、快速上手! 一、Qoder 是什么?核心亮点速览 Qoder(发音 /ˈkoʊdər/)是一款主打智能体驱动的 AI 编程平台,和普通的代码补全工具(比如 Copilot)相比,它的核心优势在于深度的项目上下文理解和自动化的复杂任务处理,简单说就是:它能 “读懂” 你的整个项目,