前端vue3使用SSE、EventSource攜帶請求頭實例代碼
一、SSE介紹
1. 定義
SSE(Server-Sent Events)是一種基于 HTTP 協(xié)議,用于實現(xiàn)服務器主動向客戶端推送數(shù)據(jù)的技術。它在客戶端與服務器之間建立一條持久化連接,并通過這條連接實現(xiàn)服務器向客戶端的實時數(shù)據(jù)推送,而客戶端不能發(fā)送數(shù)據(jù)給服務端。
總之——SSE是一種允許服務器向客戶端單向發(fā)送數(shù)據(jù)的技術。
2. 特點
- 單向通信
- 實時推送
- 輕量級
- 支持跨域、使用簡單、支持自動重連
3. 適合場景
- 數(shù)據(jù)大屏
- 消息推送
- 股票交易
- 在線聊天
- ...
二、SSE使用
1. 建立最基本的SSE連接,需要用到 EventSource
EventSource接口是Web內容與服務器發(fā)送事件通信的接口。一個
EventSource實例向HTTP服務器開啟一個持久化的連接,以text/event-stream格式發(fā)送事件,此連接會一直保持開啟直到通過調用EventSource.close()關閉。
示例:在一個vue的頁面中
const initSSE = () => {
eventSource = new EventSource('http://地址');
eventSource.onmessage = (event) => {
console.log("收到消息內容是:", event.data)
};
eventSource.onerror = (error) => {
console.error("SSE 連接出錯:", error);
eventSource.close();
};
}
onMounted(() => {
initSSE();
});
onUnmounted(() => {
if (eventSource) {
eventSource.close();
}
});2. EventSource的事件
| open | 在與事件源的連接打開時觸發(fā) |
| message | 在從事件源接收到數(shù)據(jù)時觸發(fā) |
| error | 在事件源連接未能打開時觸發(fā) |
| 具名事件 | 當從服務器端接收到指定了event字段的事件時觸發(fā),這將創(chuàng)建一個以該鍵值為值的特定事件 |
3. 建立SSE連接的時候攜帶token
如果想要在建立SSE連接的時候攜帶token,需要用到 event-source-polyfill
EventSourcePolyfill 是 EventSource 封裝好了的一個方法,可以直接配置請求頭
首先安裝依賴
npm install event-source-polyfill --save
項目中使用,完整的封裝代碼如下 sse.js 文件
import {getToken} from "@/utils/auth";
import {EventSourcePolyfill} from "event-source-polyfill";
let eventSource = null;
let reconnectAttempts = 0; // 重連次數(shù)
export default function subscribeWarnMsg(proxy, url) {
if (eventSource) {
console.log("sse已經(jīng)存在:", eventSource);
return eventSource;
} else {
eventSource = new EventSourcePolyfill(import.meta.env.VITE_APP_BASE_API + url, {
heartbeatTimeout: 3 * 60 * 1000,
headers: {
Authorization: 'Bearer ' + getToken(),
Accept: 'text/event-stream'
},
withCredentials: true,
})
eventSource.onopen = function (e) {
console.log(e, "連接剛打開時觸發(fā)");
reconnectAttempts = 0; // 重置重連次數(shù)
};
eventSource.onmessage = (event) => {
console.log("收到消息內容是:", event.data)
};
eventSource.onerror = (event) => {
console.error("SSE 連接出錯:", event);
eventSource.close(); // 關閉連接
eventSource = null;
// 自動重連邏輯
reconnectAttempts++;
const reconnectDelay = Math.min(30000, 1000 * Math.pow(2, reconnectAttempts)); // 計算重連延遲,最大延遲為30秒
console.log(`將在 ${reconnectDelay} 毫秒后嘗試重連...`);
// 等待一定時間后重連
setTimeout(() => {
if (!eventSource) {
console.log("嘗試重連 SSE...");
subscribeWarnMsg(proxy, url); // 遞歸調用重連
}
}, reconnectDelay);
}
return eventSource;
}
}頁面中使用 test.vue 文件
import subscribeWarnMsg from '@/../sse'
const {proxy} = getCurrentInstance();
const sse = ref()
function initSSE() {
sse.value = subscribeWarnMsg(proxy, `/system/sse/connect`);
sse.value.onmessage = async (event) => {
info.value = await JSON.parse(event.data)
}
}
onMounted(() => {
initSSE();
});
onUnmounted(() => {
sse.value.close()
});總結
到此這篇關于前端vue3使用SSE、EventSource攜帶請求頭的文章就介紹到這了,更多相關前端vue3 SSE攜帶請求頭內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
element el-table表格的二次封裝實現(xiàn)(附表格高度自適應)
這篇文章主要介紹了element el-table表格的二次封裝實現(xiàn)(附表格高度自適應),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
Vue3+element實現(xiàn)表格數(shù)據(jù)導出
這篇文章主要為大家學習介紹了Vue3如何利用element實現(xiàn)表格數(shù)據(jù)導出功能,文中的示例代碼講解詳細,感興趣的小伙伴快跟隨小編一起學習一下吧2023-07-07
vue中this.$refs.name.offsetHeight獲取不到值問題
這篇文章主要介紹了vue中this.$refs.name.offsetHeight獲取不到值問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
vue-baidu-map實現(xiàn)區(qū)域圈線和路徑的漸變色
這篇文章主要介紹了vue-baidu-map實現(xiàn)區(qū)域圈線和路徑的漸變色方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07

