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框架去自己实现,这样在高并发系统下的效率会更高。

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


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

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

Could not load content