SpringBoot集成WebSokcet
✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨
这里有:
硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!
👉 点击直达→ 盹猫猫的个人小站 👈
🌟 来逛逛吧,说不定能挖到你正在找的技术宝藏哦~
目录
欢迎来到 盹猫(>^ω^<)的博客
本篇文章主要介绍了
[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框架去自己实现,这样在高并发系统下的效率会更高。
上面就是所有文章内容了,如果内容对你有帮助,麻烦留一个赞👍和收藏⭐支持一下!
如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链
感谢您的关注和收藏!!!!!!
