在vue项目中webSocket封装(传token)

传递token

websocket中,目前未提供修改请求头字段的方法,参考其他的一些文章,依照他们的写法依然未能实现传递token,所有我和后端另辟蹊径,把token传在路径里面。

javascript 复制代码
    let wsUrl = "ws://39.101.77.206:8181/march/admin/interviewRecord/InterviewRecord";

 //从pinia获取token数据
     const user = userLogin()
 //按照后端的要求拼接token数据
     const token = `Bearer ${user.userInfo.token}`
     console.log(token);
 // ws请求完整地址
    const requstWsUrl = `${wsUrl}?token=${encodeURIComponent(token)}`
 //建立链接
    websock = new WebSocket(requstWsUrl)

websocket封装

1、封装

javascript 复制代码
//websocket.js

import { ElMessage } from "element-plus";
import { userLogin } from '@/stores/user.js';

let websock = null
let messageCallback = null
let errorCallback = null
let wsUrl = "ws://39.101.77.206:8181/march/admin/interviewRecord/InterviewRecord";

// 接收ws后端返回的数据
function websocketonmessage(e) {
    console.log(e, "接收后端返回的数据");
    messageCallback(JSON.parse(e.data))
}

/**
 * 发起websocket连接
 * @param {Object} agentData 需要向后台传递的参数数据
 */
export function websocketSend(agentData) {
    // 加延迟是为了尽量让ws连接状态变为OPEN   
    setTimeout(() => {
        // 添加状态判断,当为OPEN时,发送消息
        if (websock.readyState === websock.OPEN) { // websock.OPEN = 1 
            // 发给后端的数据需要字符串化
            websock.send(JSON.stringify(agentData))
        }
        if (websock.readyState === websock.CLOSED) { // websock.CLOSED = 3 
            console.log('websock.readyState=3')
            ElMessage.error('ws连接异常,请稍候重试')
            errorCallback()
        }
    }, 500)
}

// 关闭ws连接
function websocketclose(e) {
    // e.code === 1000  表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。
    // e.code !== 1000  表示非正常关闭。
    if (e && e.code !== 1000) {
        ElMessage.error('ws连接关闭')
    }
}
// 建立ws连接
function websocketOpen(e) {
    console.log('ws连接成功', e)
}

// 初始化weosocket
export function initWebSocket() {
    if (typeof (WebSocket) === 'undefined') {
        ElMessage.error('您的浏览器不支持WebSocket,无法获取数据')
        return false
    }
    //从pinia获取token数据
    const user = userLogin()
    //按照后端的要求拼接token数据
    const token = `Bearer ${user.userInfo.token}`
    // ws请求完整地址
    const requstWsUrl = `${wsUrl}?token=${encodeURIComponent(token)}`
    //建立链接
    websock = new WebSocket(requstWsUrl)

    websock.onmessage = function (e) {
        websocketonmessage(e)
    }
    websock.onopen = function () {
        websocketOpen()
    }
    websock.onerror = function () {
        ElMessage.error('ws连接异常,请稍候重试')
        errorCallback()
    }
    websock.onclose = function (e) {
        websocketclose(e)
    }
}

/**
 * 发起websocket请求函数
 * @param {function} successCallback 接收到ws数据,对数据进行处理的回调函数
 * @param {function} errCallback ws连接错误的回调函数
 */
export function sendWebsocket(successCallback, errCallback) {
    initWebSocket()
    messageCallback = successCallback
    errorCallback = errCallback
}

/**
 * 关闭websocket函数
 */
export function closeWebsocket() {
    console.log("关闭链接")
    if (websock) {
        console.log("关闭连");
        websock.close() // 关闭websocket
        websock.onclose() // 关闭websocket
    }
}

2、在vue文件中使用

这样写就可以长久的建立链接。

javascript 复制代码
// .vue

<template>
     <Editor
         v-model="content"
         mode="default"
         @onBlur="handleBlur(scoped.row.Record[index])"
      />
</template>

<script setup>

import { ref, onMounted, onBeforeUnmount } from "vue";

import {
  sendWebsocket,
  closeWebsocket,
  websocketSend,
} from "@/utils/websocket.js";


onMounted(() => {
  sendWebsocket(wsMessage, wsError);
});

//富文本框失去焦点
const handleBlur = (e) => {
  // 发起ws数据
  websocketSend(e);
};

// 监听服务器传来的变化
const wsMessage = (data) => {
  const dataJson = data;
  // 这里写拿到数据后的业务代码
  console.log(dataJson)
};

const wsError = () => {
  // 比如取消页面的loading
  console.log("ws连接错误的回调函数");
};

// 页面销毁时关闭ws。因为有可能ws连接接收数据尚未完成,用户就跳转了页面
// 在需要主动关闭ws的地方都可以调用该方法
onBeforeUnmount(() => {
  closeWebsocket();
});

<script>
相关推荐
岚天start1 小时前
Linux系统网络排查工具总结
linux·运维·网络·监控·扫描·连通性·流量
王燕龙(大卫)2 小时前
tcp会无限次重传吗
网络·tcp/ip
weisian1513 小时前
HTTP协议-3-HTTP/2是如何维持长连接的?
网络·网络协议·http
三年呀4 小时前
标题:移动端安全加固:发散创新,筑牢安全防线引言:随着移动互联网
网络·python·安全
x.Jessica4 小时前
网络的构成元素
网络·学习·计算机网络
tan77º5 小时前
【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
linux·网络·分布式·网络协议·tcp/ip·rpc·json
前端世界8 小时前
在鸿蒙里优雅地处理网络错误:从 Demo 到实战案例
网络·华为·harmonyos
墨雨听阁8 小时前
8.18网络编程——基于UDP的TFTP文件传输客户端
网络·网络协议·学习·udp
小晶晶京京8 小时前
day35-负载均衡
运维·网络·网络协议·学习·负载均衡
网络研究院10 小时前
网络安全和基础设施安全局 (CISA) 表示微分段不再是可选的
网络·安全·web安全·零信任·微分段