计算机基础协议/概念:推送数据— —WebSocket与SSE;前端Blob/URL下载文件

2023-09-21 21:52:49

计算机基础协议/概念:推送数据— —WebSocket与SSE

1 WebSocket:双向通信

1.1 概念:通信过程

在这里插入图片描述

①Upgrade:浏览器告知服务器升级为WebSocket协议
②Switch:服务器升级成功后会返回101状态码
③Communicate:浏览器和服务器就可以以WebSocket格式发送数据

1.2 实战:实现简易聊天室

WebSocket实战:实现简易聊天室

2 SSE(Server Send Event):服务器单项推送消息,text/event-stream

在这里插入图片描述

2.1 概念:特点

①服务端返回的Content-Type:text/event-stream

这是一个流,可以返回多次内容

  • Server Send Event就是通过这种消息来随时推送数据

在这里插入图片描述

2.2 应用场景

①CICD平台实时打印日志

CICD平台需要实时打印日志,那么它的日志是如何实现实时打印的呢?

  • 这种明显需要一段一段的传输数据,一般就是用SSE来推送数据
②ChatGPT回答框:一部分一部分加载回答

ChatGPT的回答不是一次性给全部的,而是一部分一部分的加载回答

在这里插入图片描述

拓展:前端下载文件的方式Blob下载、URL下载

  • Blob下载适用于需要动态生成文件内容的场景,比如将前端生成的数据导出为文件,如导出Excel、导出PDF等。
  • 浏览器URL直接下载适用于已经存在于服务器上的文件下载,比如用户下载软件安装包、下载图片、下载文档等。

1. 加载URL(location.href):可以下载浏览器无法预览的文件(.tar等)

对于浏览器不能打开的文件(例如:.rar .doc等)是可以实现文件下载的,但是对于浏览器可以打开的(例如:.txt .xml等)只可以实现预览功能

  • location.href
  • window.open
  • a标签
window.location.href="https://106.14.15.103:8000/downloadFile/test"

上述三种都是通过加载文件url直接下载,如果后端返回文件流,则需要先转化为url再下载;
另外上述三种方式默认是get方式,如果需要使用post方式且需传参,最好使用下面文件流方式

2. 文件流下载(后端返回文件流转为blob)

现在有一个需求,文件下载,但需要鉴权,这就意味着不能用后台返回下载链接的方式进行下载,因为一旦被别人拿到这条链接,就可以不需要任何权限就直接下载,因此需要换种思路,那么就需要用到blob(binary large object)对象,就是下面的这种方式

1.ajax请求将文件流下载下来
2.将下载的文件流转化为blob数据
3.通过 window.URL.createObjectURL(blob)将blob转化为url
4.通过动态生成a标签 模拟点击事件下载

Blob使用场景:

  • 大文件分片上传
this.$http({
   url: this.$http.adornUrl(`/strUrl/${id}`),
   method: 'get',
   responseType: 'blob',
   timeout: 1000 * 600
 }).then(res => {
   console.log('res', res)
   if (res.status === 200) {
     const blob = new Blob([res.data], { type: `application/octet-stream` })
     const downloadElement = document.createElement('a')
     const href = window.URL.createObjectURL(blob)
     downloadElement.href = href
     downloadElement.download = `${filename}`
     downloadElement.click()
   } else {
     this.$message.error('下载出错!')
   }
 })

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

3. 二者区别

  1. 返回URL: 当后端返回一个URL时,实际上是将文件存储在服务器上,并将文件的URL返回给前端。前端通过访问该URL来下载文件。这种方式需要确保服务器上的文件访问权限设置正确,以防止未授权用户访问文件。
  2. 返回二进制流: 当后端直接返回二进制流时,前端可以将二进制数据保存为Blob对象,并通过Blob下载的方式将文件保存到本地。这种方式不需要将文件存储在服务器上,可以动态生成文件内容,对于一些敏感数据,可以避免在服务器上存储。
  • 相比于返回URL,Blob下载具有以下优势,从而提供了更高的安全性:
  • 避免敏感数据存储在服务器上: 使用Blob下载可以避免将敏感数据存储在服务器上,减少了数据泄露的风险。
  • 动态生成文件内容: Blob下载可以动态生成文件内容,这意味着可以将非文件类型的数据(如图表、报表等)直接生成为文件进行下载,而不需要在服务器上事先存在该文件。
  • 临时性: Blob对象是临时的,只存在于浏览器的内存中,不会在本地永久保存。这可以减少文件被他人恶意获取的风险。
3.1 URL:静态文件下载、文件共享

返回URL使用场景:

静态文件下载:适用于需要访问和下载已经存在于服务器上的静态文件,如图片、文档、软件安装包等。
文件共享:可以将文件存储在服务器上,并通过URL分享给其他用户下载。

3.2 Blob:前端数据导出文件excel等、数据加密

返回Blob场景:

动态文件下载:适用于需要动态生成文件内容的场景,比如将前端生成的数据导出为文件,如导出Excel、导出PDF等。
数据加密:可以将敏感数据加密后返回给前端,前端可以将加密后的数据保存为Blob对象进行下载。

参考:https://blog.csdn.net/qq_40298902/article/details/121779944

更多推荐

【Oracle】Oracle系列之二--Oracle数据字典

文章目录往期回顾前言1.什么是Oracle数据字典2.数据字典的内容(1)X$表(2)数据字典表、数据字典视图(3)动态性能视图3.数据字典应用示例(1)查询表的信息(2)查询索引的信息(3)查询用户的信息(4)查询表空间的信息(5)查询数据文件的信息(6)查询数据库的性能数据往期回顾【Oracle】Oracle系列–

【腾讯云 Cloud Studio 实战训练营】快速构建React完成点餐H5页面

一,前言1.1相关链接官网地址:CloudStudio官方文档地址:CloudStudio(云端IDE)简介|CloudStudio1.2CloudStudio(云端IDE)简介CloudStudio是基于浏览器的集成式开发环境(IDE),用户在使用CloudStudio时无需安装,随时随地打开浏览器就能在线编程,给开

React进阶

TODO1组件生命周期React组件生命周期|菜鸟教程(runoob.com)https://www.runoob.com/react/react-component-life-cycle.html什么是组件生命周期在React中,组件生命周期是指组件从创建到销毁期间经历的一系列阶段。在每个阶段,React给予我们不同

vue页面嵌入飞书网页组件,用于在类似ERP,OA等系统中展示在线文档

先展示最终效果(就是在vue页面中,内嵌了一块ifream页面):1.注册进入飞书开放平台,地址为:飞书开放平台2.进入开放平台后,选择--创建企业自建应用--创建网页应用,然后在主页面记住该应用的appId和appSecret参数,后面要用3.然后注意一点的是,因为后面的授权等逻辑我们一般用我们自己的文档做测试,但是

React antd Select 无法在disabled状态下选择并复制输入框内的内容情况分析及解决方案

文章目录背景问题分析解决思路一:会不会是由于在选择框内hover的时候出现的那个图标导致的解决思路二:会不会是这个span禁止复制解决思路三:去看看antd具体实现最终解决方案其他版本的解决方案antd3.*antd5.*背景在React项目开发中,我们经常会用到antd内的Select组件。有时候我们会在disabl

Eureka注册中心

文章目录1.Eureka的结构与作用2.搭建eureka-server服务3.注册service服务4.服务发现1.Eureka的结构与作用在Eureka架构中,微服务角色有两类:lEurekaServer:服务端,注册中心记录服务信息u心跳监控lEurekaClient:客户端Provider:服务提供者注册自己的信

数据结构前瞻

集合框架JAVA的集合框架是定义在java.util包下的一组接口和实现类,用于将多个元素置于一个单元中,对这些元素进行快速,便捷的存储,减速和管理,即增删查改下面的格子,黄色代表接口,蓝色代表抽象类,棕色代表类是动态数组(顺序表)优先级队列是双向列表底层就是一颗红黑树重要的四个接口算法效率时间复杂度即算法中基本操作的

2022年贵州省职业院校技能大赛中职组网络安全赛项规程

2022年贵州省职业院校技能大赛中职组网络安全赛项规程一、赛项名称赛项名称:网络安全赛项归属:信息技术类二、竞赛目的为检验中职学校网络信息安全人才培养成效,促进网络信息安全专业教学改革,培养大批既满足国家网络安全战略需要有具备世界水平的优秀技能人才,在社会上营造“技能改变命运、匠心成就人生”的崇尚技能的氛围,国家教育部

深入理解WPF中MVVM的设计思想

近些年来,随着WPF在生产,制造,工业控制等领域应用越来越广发,很多企业对WPF开发的需求也逐渐增多,使得很多人看到潜在机会,不断从Web,WinForm开发转向了WPF开发,但是WPF开发也有很多新的概念及设计思想,如:数据驱动,数据绑定,依赖属性,命令,控件模板,数据模板,MVVM等,与传统WinForm,ASP.

Redis实现Session持久化

Redis实现Session持久化1.前言直接使用Session存储用户登录信息,此时的会话信息是存储在内中的,只要项目重启存储的Session信息就会丢失。而使用Redis存储Session的话就不会存在这种情况,即使项目重启也并不影响,也无需用户重新登录。使用Redis存储Session,还能让项目支持分布式的,比

如何将 Transformer 应用于时间序列模型

在机器学习的广阔前景中,transformers就像建筑奇迹一样高高耸立,以其复杂的设计和捕获复杂关系的能力重塑了我们处理和理解大量数据的方式。自2017年创建第一个Transformer以来,Transformer类型呈爆炸式增长,其中包括ChatGPT和DALL-E等强大的生成式AI模型。虽然transformer

热文推荐