Vue3(pinia) 整合 SpringWebsocket链接url动态传参

前言
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:java专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

目录

  • 一.环境准备
  • 二.vue代码
  • 三.SpringWebsocket相关理论
    • 3.1 AbstractWebSocketHandler
    • 3.2 HttpSessionHandshakeInterceptor
    • 3.3 WebSocketConfigurer
  • 四.spring boot代码
    • 4.1继承AbstractWebSocketHandler
    • 4.2 实现WebSocketConfigurer

一.环境准备

vue3 :官方文档 https://cn.vuejs.org/
pinia:官方文档 https://pinia.vuejs.org/zh/
springWebSocket的maven坐标

 	<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>

二.vue代码

pinia的安装和使用就不说了直接看官方文档就行。

1、创建stores/demo.ts

import { defineStore } from 'pinia'
import { ref } from 'vue'export const useChantStore = defineStore('chant', () => {//stateconst msg = ref("")//发送的消息var socket= ref() ;const userId = ref("")  //传递的参数const count = ref(0)  	//链接标志//action// Websoket连接成功事件const websocketonopen = (res: any) => {console.log("WebSocket连接成功", res);};// Websoket接收消息事件const websocketonmessage = (res: any) => {console.log("数据", res);msg.value = res.data};// Websoket连接错误事件const websocketonerror = (res: any) => {console.log("连接错误", res);};// Websoket断开事件const websocketclose = (res: any) => {console.log("断开连接", res);websocketclose;// 销毁 websocket 实例对象socket.value = null;count.value = 0;userId.value = '';};//创建链接const connectWebSocket = () =>{console.log("websocket创建链接 usrid= ",userId.value);const wsurl = `ws://127.0.0.1:8888/api/myWs1?userId=${userId.value}`;socket.value = new WebSocket(wsurl);socket.value.onopen = websocketonopen;socket.value.onmessage = websocketonmessage;socket.value.onerror = websocketonerror;socket.value.onclose = websocketclose;count.value = 1;}//关闭链接const closetWebSocket = () =>{websocketclose;// 销毁 websocket 实例对象socket.value = null;count.value = 0;userId.value = '';}return { msg, socket,userId,count,connectWebSocket,closetWebSocket }
})

二、在使用的组件中使用

import { useChantStore } from '../stores/chant'
//websocket
const chantWebSocket = useChantStore()
//你自己的代码

三.SpringWebsocket相关理论

主要的接口

在这里插入图片描述

3.1 AbstractWebSocketHandler

AbstractWebSocketHandler:是 Spring Framework 中用于处理 WebSocket 通信的一个基础抽象类,它位于 org.springframework.web.socket.handler 包下。在构建基于Spring的WebSocket应用时,开发者可以扩展这个类来创建自定义的消息处理器。

  • 连接建立与关闭处理

    • void afterConnectionEstablished(WebSocketSession session):当一个新的WebSocket连接建立后,此方法会被调用,开发者可以在其中进行初始化操作或者订阅事件。
    • void handleTransportError(WebSocketSession session, Throwable exception):当在传输层发生错误时调用,可用于处理异常情况和清理资源。
    • void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus):在WebSocket连接关闭后执行,通常用来清理资源或记录日志。
  • 消息处理

    void handleMessage(WebSocketSession session, WebSocketMessage<?> message):这是一个抽象方法,子类需要实现它来处理从客户端接收到的各种类型的消息。

  • 握手协商:

    可以通过重写 boolean supportsPartialMessages() 来表明是否支持分片消息。

  • 其他功能:

    它还可能提供一些便利的方法用于发送消息给客户端、设置会话属性等。

3.2 HttpSessionHandshakeInterceptor

HttpSessionHandshakeInterceptor 是 Spring Framework 中用于 WebSocket 扩展的一个类,它继承自 HandshakeInterceptor 接口,并特别关注于在 WebSocket 握手阶段与 HTTP HttpSession 的交互。

当客户端尝试建立 WebSocket 连接时,会触发一个握手过程,在这个过程中,服务器可以使用 HttpSessionHandshakeInterceptor 来拦截握手请求和响应,以便进行额外的检查、修改握手参数或执行特定的业务逻辑。
通过实现或扩展 HttpSessionHandshakeInterceptor 类,开发人员能够定制WebSocket连接初始化的过程,比如进行权限验证、会话同步以及对跨域支持等需求的处理。

HttpSessionHandshakeInterceptor 提供了两个核心方法

  • beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes):

    • 在握手开始前调用,允许开发者检查HTTP请求并决定是否应该继续握手。
    • 可以从HTTP请求中获取当前的HttpSession,并将需要的数据复制到WebSocketSession的属性中。
    • 可以通过修改attributes参数来添加或删除即将传递给WebSocketSession的属性。
    • 如果返回false,则会中断握手,即拒绝建立WebSocket连接。
  • afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception):

    • 在握手成功完成后调用,无论握手是否成功,都会执行此方法(如果握手失败,则exception参数将包含相关异常)。
    • 通常在此处用于清理资源、记录日志或者进行其他后处理操作。

3.3 WebSocketConfigurer

WebSocketConfigurer 是 Spring Framework 中用于配置 WebSocket 功能的接口,它允许开发者自定义 WebSocket 服务端点(endpoint)的行为和路由规则。该接口位于 org.springframework.web.socket.config.annotation 包下,是 Spring WebSocket 支持的核心部分。

在基于 Spring Boot 构建 WebSocket 应用程序时,通过实现 WebSocketConfigurer 接口或使用其子接口如 DelegatingWebSocketMessageBrokerConfiguration 等,可以方便地配置 WebSocket 的核心功能:

  • 注册 WebSocketHandler:

    开发者可以通过实现 WebSocketConfigurer 中的相应方法来注册处理 WebSocket 连接请求的 WebSocketHandler 实例。这些 Handler 负责与客户端进行双向通信,包括消息接收、处理和发送。

  • 配置访问路径:

    可以设置 WebSocket 的入口地址,即客户端通过哪个 URL 建立 WebSocket 连接。

  • 跨域支持:

    配置是否允许来自不同源的 WebSocket 请求,即 CORS (Cross-Origin Resource Sharing) 政策。

  • 定制握手过程:

    添加 HandshakeInterceptor 实例,以便在 WebSocket 握手阶段执行额外的验证逻辑或操作。

  • 会话管理:

    定义如何管理 WebSocketSession,例如设置超时策略等。

四.spring boot代码

4.1继承AbstractWebSocketHandler

@Slf4j
@Component
public class MyWsHandler extends AbstractWebSocketHandler {//保存已经链接的用户private static Map<String, WsSessionBean> wsSessionBeanMap;static {wsSessionBeanMap = new ConcurrentHashMap<>();}/*** //建立链接* @param session* @throws Exception*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {super.afterConnectionEstablished(session);//过去ur中的参数URI uri = session.getUri();UriComponents components = UriComponentsBuilder.fromUri(uri).build();MultiValueMap<String, String> queryParams = components.getQueryParams();String userId = queryParams.getFirst("userId");WsSessionBean wsSessionBean = new WsSessionBean(Integer.valueOf(userId), session);wsSessionBeanMap.put(session.getId(), wsSessionBean);log.info("建立链接了。。。。。{}", wsSessionBean);}//收到消息@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {super.handleMessage(session, message);log.info("当前session信息:{}", session);log.info("消息是:message:{}", message.getPayload());//广播消息===========================自己实现的代码,用来发送消息sendMessageToBroadcast(session.getId(), message.getPayload().toString());}
/*** 发送消息到所有客户端 (广播消息 发给当前用户得所有好友)** @param userId      当前用户sessionId* @param messageText 当前用户要发送得内容*/public void sendMessageToBroadcast(String userId, String messageText) {wsSessionBeanMap.forEach((k, v) -> {if (!k.equals(userId)) {//说明要发得对象WebSocketSession targetSession = v.getSession();if (targetSession != null && targetSession.isOpen()) {TextMessage textMessage = new TextMessage(messageText);try {targetSession.sendMessage(textMessage);} catch (IOException e) {throw new RuntimeException(e);}} else {log.info("无法向用户{}发送消息,会话未建立或已关闭", userId);}}});}/*** 传输异常** @param session* @param exception* @throws Exception*/@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {super.handleTransportError(session, exception);if (session.isOpen()) {session.close();wsSessionBeanMap.remove(session.getId());}log.info("传输异常");}/*** 链接关闭** @param session* @param status* @throws Exception*/@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {super.afterConnectionClosed(session, status);wsSessionBeanMap.remove(session.getId());log.info("链接关闭");}}

4.2 实现WebSocketConfigurer

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Resourceprivate MyWsHandler myWsHandler;@Beanpublic HandshakeInterceptor httpSessionHandshakeInterceptor() {return new HttpSessionHandshakeInterceptor();}@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(myWsHandler,"/myWs1").setAllowedOrigins("*");}
}

欢迎大家👍点赞👍 + 👀关注👀 + 🤏收藏🤏 如有不足请指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/492625.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

挑战杯 基于机器学习与大数据的糖尿病预测

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE&#xff08;递归特征消除法&#xff09;4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

好狄空气能热水器成功上榜2023年消费者心中的十大信赖品牌

随着环保意识的增强和能源消耗的持续关注&#xff0c;空气能热水器以其高效节能、绿色环保的特性赢得了越来越多消费者的青睐。市场上琳琅满目的空气能热水器品牌让消费者在选择时既兴奋又困惑。究竟哪些品牌能在激烈的竞争中脱颖而出&#xff0c;成为消费者心目中的佼佼者呢&a…

GO数组解密:从基础到高阶全解

在本文中&#xff0c;我们深入探讨了Go语言中数组的各个方面。从基础概念、常规操作&#xff0c;到高级技巧和特殊操作&#xff0c;我们通过清晰的解释和具体的Go代码示例为读者提供了全面的指南。无论您是初学者还是经验丰富的开发者&#xff0c;这篇文章都将助您更深入地理解…

YOLO算法改进Backbone系列之:EfficientViT

EfficientViT: Memory Effificient Vision Transformer with Cascaded Group Attention 摘要&#xff1a;视觉transformer由于其高模型能力而取得了巨大的成功。然而&#xff0c;它们卓越的性能伴随着沉重的计算成本&#xff0c;这使得它们不适合实时应用。在这篇论文中&#x…

掌握C语言指针,轻松解锁代码高效性与灵活性

1. 指针与地址 1.1 概念 我们都知道计算机的数据必须存储在内存里&#xff0c;为了正确地访问这些数据&#xff0c;必须为每个数据都编上号码&#xff0c;就像门牌号、身份证号一样&#xff0c;每个编号是唯一的&#xff0c;根据编号可以准确地找到某个数据。而这些编号我们就…

4.测试教程 - 用例篇

文章目录 1.测试用例的基本要素2.测试用例的给我们带来的好处3.测试用例的设计方法3.1基于需求进行测试用例的设计3.1.1功能需求测试分析3.1.2非功能需求测试分析 3.2具体的设计方法3.2.1等价类3.2.2边界值3.2.3错误猜测法3.2.4判定表3.2.5场景设计法3.2.6因果图3.2.7因果图的需…

Bootstrap引入和使用

Bootstrap 基础用法 目录 Bootstrap 基础用法什么是Bootstrap&#xff1f;引入Bootstrap布局容器栅格系统表格样式表单样式text样式按钮样式图标 什么是Bootstrap&#xff1f; Bootstrap是一个开源的前端框架&#xff0c;用于对HTML和CSS代码进行封装&#xff0c;因此可以直接…

2024年蓝牙耳机哪个好?五大口碑热门爆棚机型力荐!

​长时间的通勤或等待中&#xff0c;我喜欢戴着耳机静静地听音乐&#xff0c;享受那片刻的宁静。对我来说&#xff0c;耳机是生活中不可或缺的数码产品&#xff0c;无论是在路上还是在运动时&#xff0c;我都会随身携带。在这篇文章中&#xff0c;我将分享我对耳机的了解和使用…

buuctf_misc_神秘的龙卷风+另外一个世界+假如给我三天光明

神秘的龙卷风 题目&#xff1a; 题目下载后是一个被加密的压缩包。通过题目可以猜到&#xff0c;压缩包的密码是4位数字&#xff0c;解开后应该是一串编码。咱先用ARCHPR解出口令呗&#xff1a; &#xff08;攻击类型-暴力&#xff0c;范围是所有数字&#xff0c;范围0000~99…

09 呼吸灯

呼吸灯简介 呼吸灯实际展示的效果就是一个 LED 灯的亮度由亮到暗&#xff0c;再由暗到亮的变化过程&#xff0c;并且该过程是循环往复的&#xff0c;像呼吸一样那么有节奏。 呼吸灯通常是采用 PWM(Pulse Width Modulation&#xff0c;即脉冲宽度调制) 的方式实现&#xff0c;在…

MySQL存储整数ip地址的优势

ipv4的地址字符串分布为0.0.0.0->255.255.255.255&#xff0c;其中最小长度为7&#xff0c;最大长度为15。 假设其均匀分布&#xff0c;则需要平均占用13.28125字符&#xff0c;计算方法如下&#xff0c;如果将这些字符串存储在数据库中&#xff0c;则还需要一个字符记录字符…

Wagtail安装运行并结合内网穿透实现公网访问本地网站界面

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xf…