SSE 与 WebSocket 作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息SSE 是单向通道,只能服务器向浏览器发送,因为流信息本质上就是下载。如果浏览器向服务器发送信息,就变成了另一次 HTTP 请求
使用方法
Server-Sent Events 教程 - 阮一峰的网络日志
https://www.ruanyifeng.com/blog/2017/05/server-sent_events.html
缺点:不可以比如请求头中加token等
- getSSE() {
- return new Promise((resolve, reject) => {
- let base = process.env.VUE_APP_SYSTEMURL;
- let url = `${base}/server/sampleRemovePush/sse`;
- if (window.EventSource) {
- this.SSE = new EventSource(url);
- this.SSE.addEventListener(
- "open",
- e => {
- console.log("建立连接。。。", e);
- },
- false
- );
- this.SSE.addEventListener(
- "message",
- event => {
- console.log("ebent", event);
- resolve(event);
- },
- false
- );
- this.SSE.addEventListener(
- "error",
- event => {
- // readyState连接状态: 0 - connecting; 1 - open; 2 - closed;
- if ((event.readyState = EventSource.CLOSED)) {
- console.log("sse错误------", event);
- reject("请求错误!");
- } else {
- resolve(event);
- }
- },
- false
- );
- // this.SSE.addEventListener("close", event => {
- // console.log("我要关闭啦", event.type);
- // this.SSE.close();
- // });
- } else {
- console.log("你的浏览器不支持SSE");
- }
- });
- },
如果加自定义参数可以使用三方插件event-source-polyfill
npm install event-source-polyfill
-
- import {EventSourcePolyfill} from 'event-source-polyfill';
-
- let base = process.env.VUE_APP_SYSTEMURL;
- let url = `${base}/server/sampleRemovePush/sse`;
- let { access_token } = this.$store.state.login.login;
- var es = new EventSourcePolyfill(url, {
- headers: {
- Authorization: access_token ? `Bearer${access_token}` : ""
- }
- });
-
- es.onopen = function(event) {
- console.log("连接成功", event);
- };
-
- es.onmessage = function(event) {
- // to to something…
- console.log("接收信息", event);
- };
-
- es.onerror = function(error) {
- // 监听错误
- console.log("错误", error);
- };
可 以看到token是有加上去的
