跨域问题经典解决方法

这里写目录标题

  • 背景
  • 步骤
    • m3u8文件是什么??
    • 本地播放m3u8文件
    • 在浏览器上播放m3u8视频
    • 跨域问题
      • 什么是跨域问题?
      • 为什么有跨域问题?
      • 如何解决跨域问题?
        • 使用代理服务器
        • CORS(跨域资源共享)
  • 总结

背景

同源策略问题是开发中重要的问题,尤其是前后端分离的业务。之前没有将这个问题明示出来,现在就来总结一下吧,公司最近也在做m3u8视频文件相关业务,我自己打算写一个小demo玩,网站上这种m3u8视频流的格式之前没有注意过,发现还蛮有意思。在浏览器上播放m3u8文件的时候正好报了这个问题,顺手解决总结一下。

步骤

m3u8文件是什么??

M3U8文件是基于HTTP Live Streaming(HLS)协议的一种文件格式,其实现原理主要涉及到流媒体传输和文件分片的概念。

HLS是由苹果公司提出的一种基于HTTP的流媒体网络传输协议。该协议通过将整个流媒体内容分割成一系列小的、基于HTTP的文件(通常是TS格式的文件)来进行传输。每个TS文件都包含一小部分流媒体数据,并且都有一个唯一的序列号。

M3U8文件在HLS协议中起到了关键的作用。它是一个纯文本文件,里面包含了指向这些TS文件的URL地址列表。这些URL地址按照播放顺序排列,客户端通过读取M3U8文件,可以依次下载并播放这些TS文件,从而实现流媒体内容的在线播放。

此外,M3U8文件还包含了一些元数据和控制信息,用于描述流媒体内容的属性和播放参数。例如,它可以定义当前M3U8文件中第一个文件的序列号,这对于在码率切换时进行对齐非常重要。同时,M3U8文件还可以指定播放列表的更新频率、码率选择等信息,以满足不同网络环境和设备的需求。

通过M3U8文件和HLS协议,流媒体内容可以在互联网上高效、可靠地传输和播放,为用户提供了流畅的在线视听体验。

本地播放m3u8文件

因为我是想自己学学,所以我专门去找了在本地一个正常的mp4文件是如何被切片变成m3u8文件进行播放的。手动使用ffmpeg将mp4转成未加密的m3u8文件和ts文件,然后进行加密(在m3u8文件中添加加密信息),最终再使用ffmpeg解密播放视频。
因为这不是本文章的重点,所以具体参考如下链接

ffmpeg教程
在这里插入图片描述

在浏览器上播放m3u8视频

首先在本地建立一个html页面,代码内容如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>测试m3u8电影切片</title><link rel="stylesheet" href="./css/video-js.css">
</head>
<body><video id="example-video" width="960" height='400' class="video-js vjs-default-skin" autoplay="autoplay" controls="controls" loop="loop"><sourcesrc="C:\Users\Administrator\Desktop\test\part.m3u8"type="application/x-mpegURL"></video><script src="./js/video.min.js"></script>
<script src="./js/videojs-contrib-hls.min.js"></script>
<script>var player = videojs('example-video');player.play();
</script> 
</body>
</html>

这里就报跨域问题了

在这里插入图片描述

跨域问题

什么是跨域问题?

当一个请求的url的协议、域名、端口三者只要有一个与当前页面的url不同则会出现跨域问题。

为什么有跨域问题?

跨域问题存在的原因主要是浏览器的同源策略。同源策略是浏览器的一种安全机制,它限制了一个源(即协议、域名、端口号相同)的文档或脚本与另外一个源的资源进行交互。这是为了保障用户的信息安全,防止恶意网站通过跨域访问获取用户的敏感信息,从而保护用户的隐私和财产安全。如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。

反证法:如果没有同源策略的话会怎么样呢?
现在,假设http://example.com网站有一个页面,该页面中的JavaScript代码试图通过AJAX请求访问http://anotherexample.com网站上的一个资源(比如一个API接口)。由于这两个网站属于不同的源,浏览器的同源策略会阻止这种跨域请求。即使http://anotherexample.com网站上的资源是公开的,并且没有设置任何访问限制,浏览器的同源策略也会阻止这种请求。

这个限制的目的是防止恶意脚本攻击。如果没有同源策略的限制,那么一个恶意网站就可以通过JavaScript代码来访问并获取其他网站的敏感数据,比如用户的登录状态、个人信息等。这样一来,用户的隐私和财产安全就会受到威胁。

所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

当一个请求的url的协议、域名、端口三者只要有一个与当前页面的url不同则会出现跨域问题

在这里插入图片描述

如何解决跨域问题?

使用代理服务器

我首先统一协议,使用http协议,我将我的前端页面放到tomcat服务器下(相关资源都放在同一目录下)

然后在windows上安装nginx反向代理服务器,可以参照如下链接
windows安装nginx方法

然后进行如下配置

我这边监听8000端口
在这里插入图片描述

  location / {root   html;index  index.html index.htm;}location /back {  proxy_pass  http://localhost:8080/test/part.m3u8;  }

我将我的html文件放在此路径下,将nginx的默认文件进行替换。
在这里插入图片描述

将其中代码的接口进行更改
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>测试m3u8电影切片</title><link rel="stylesheet" href="./css/video-js.css">
</head>
<body><video width="960" height='400' class="video-js vjs-default-skin" autoplay="autoplay" controls="controls" loop="loop"><source  src="http://localhost:8000/back"type="application/x-mpegURL"></video><video id="example-video" width="960" height='400' class="video-js vjs-default-skin" autoplay="autoplay" controls="controls" loop="loop"><source  src="http://localhost:8000/back"type="application/x-mpegURL"></video><script src="./js/video.min.js"></script>
<script src="./js/videojs-contrib-hls.min.js"></script>
<script>var player = videojs('example-video');player.play();
</script> 
</body>
</html>

这样的话就不会再报跨域的问题了,因为协议,域名,端口都一致了
在这里插入图片描述

最终结果:

在这里插入图片描述

注意事项:

1、浏览器内核不一样视频可能不能正常播放,如火狐就能播放我的视频,但是Edge和chorm就不行,兼容性不一样。

2、m3u8文件的ts文件路径还有问题,我去修改了m3u8文件中的ts文件改为代理路径,并在nginx中进行了配置,你们在操作的时候可以直接拿一个boot后端项目进行测试,相对简单,本地测试只关注端口就可以了

CORS(跨域资源共享)

这是一种在服务器端设置响应头来允许跨域访问的方法。通过在服务器端设置Access-Control-Allow-Origin等响应头,可以指定允许访问的域名,从而实现跨域访问。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

可以看到虽然端口号不一致,但是接口响应成功,并把8081端口的返回值显示在页面上是“1111”。

这种做法适用于可以修改服务端代码的情况,如果您是要访问别人的后端,还是使用代理服务器比较好,比较通用,而且也不涉及到耦合业务代码,实际情况个还是要看您自己。

总结

解决跨域问题的方法有多种,以下是一些常见的解决方案:

代理服务器:在前端服务和后端接口服务之间架设一个中间代理服务,该代理服务的地址与前端服务一致。这样,代理服务与前端服务之间由于协议、域名、端口三者统一,不存在跨域问题,可以直接发送请求。同时,代理服务与后端服务之间由于不经过浏览器,没有同源策略的限制,也可以直接发送请求。通过这种方式,可以通过中间代理服务器做接口转发,解决跨域问题。
JSONP:这种方法仅适用于GET请求。它通过动态创建script标签来进行跨域请求,因为script标签不受同源策略的限制。服务器返回的数据需要包裹在一个函数调用中,前端通过设置回调函数来获取数据。
CORS(跨域资源共享):这是一种在服务器端设置响应头来允许跨域访问的方法。通过在服务器端设置Access-Control-Allow-Origin等响应头,可以指定允许访问的域名,从而实现跨域访问。
WebSocket:WebSocket协议不受同源策略限制,可以直接在浏览器上建立持久的双向通信。因此,可以使用WebSocket进行跨域通信。
iframe嵌套:将需要跨域的内容放在一个独立的页面中,并通过iframe嵌套到当前页面中。由于不同域名的iframe之间不受同源策略限制,因此可以实现跨域访问。但这种方法存在一些限制和潜在的安全问题,需要谨慎使用。

在选择解决方案时,需要根据具体的应用场景和需求来综合考虑。例如,如果后端接口支持CORS,那么使用CORS可能是最简单直接的方法。如果后端接口不支持CORS,或者需要解决更复杂的跨域问题,那么可能需要考虑使用代理服务器或其他方法。同时,也需要注意跨域问题可能带来的安全风险,并采取相应的安全措施来保护用户的隐私和财产安全。

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

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

相关文章

42.坑王驾到第八期:uniCloud报错

uniCloud 报错 今天调用云函数来调试小程序的时候突然暴了一个奇葩错误&#xff0c;require(…).main is not a function。翻官方文档后发现&#xff0c;原来是这样&#xff1a;**如果你写的是云对象&#xff0c;入口文件应为 index.obj.js&#xff0c;如果你写的是云函数入口…

C# 文件拖入控件中,显示文件路径

1.设置所需拖入的控件&#xff08;以Textbox为列&#xff09;属性为&#xff1a; this.textBox1.AllowDrop true; //设置AllowDrop 属性为 true&#xff0c;使之支持拖拽&#xff0c;否则拖拽显示禁用状态 2.设置该控件的两个事件&#xff0c;分别为&#xff1a; ①DragEnt…

COSCUP 2024 正式启动议题征集,开源社专属邀请通道开启,欢迎报名参加!

COSCUP 是由台湾开放原始码社群联合推动的年度研讨会&#xff0c;起源于 2006 年&#xff0c;是台湾自由软体运动 (FOSSM) 重要的推动者之一。活动包括有讲座、摊位、社团同乐会等&#xff0c;除了邀请国际的重量级演讲者之外&#xff0c;台湾本土的自由软体推动者也经常在此发…

RAG一文读懂!概念、场景、优势、对比微调与项目代码示例

本文结合“基于 ERNIE SDKLangChain 搭建个人知识库”的代码示例&#xff0c;为您讲解 RAG 的相关概念。 01 概念 在2020年 Facebook AI Research(FAIR)团队发表一篇名为《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》的论文。这篇论文首次提出了 RA…

计算机网络(五)

网络层 网络层的主要目的是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输。 要实现网络层&#xff0c;主要解决三个问题&#xff1a; ①网络层向运输层提供怎样的服务&#xff1f;&#xff08;“可靠传输“、”不可靠传输“&#xff09; ②网络层寻址 ③路由选择…

C++提高笔记(三)---STL容器(vector、deque)

1、vector容器 1.1vector基本概念 功能&#xff1a;vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a;不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0…

波奇学Linux:

死锁 一组进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用不会释放资源&#xff0c;而处于一种永久等待的状态 进程一占有资源A不释放&#xff0c;进程二占有资源B不释放&#xff0c;进程一申请资源B&#xff0c;进程二申请资源A&#xff0c;两个进程都属…

算法时空复杂度分析:大O表示法

文章目录 前言大O表示法3个时间复杂度分析原则常见的时间复杂度量级空间复杂度参考资料 前言 算法题写完以后&#xff0c;面试官经常会追问一下你这个算法的时空复杂度是多少&#xff1f;&#xff08;好像作为一名算法工程师&#xff0c;我日常码代码的过程中&#xff0c;并没…

MySQL学习Day32——数据库备份与恢复

在任何数据库环境中&#xff0c;总会有不确定的意外情况发生&#xff0c;比如例外的停电、计算机系统中的各种软硬件故障、人为破坏、管理员误操作等是不可避免的&#xff0c;这些情况可能会导致数据的丢失、 服务器瘫痪等严重的后果。存在多个服务器时&#xff0c;会出现主从服…

[JAVAEE]—进程和多线程的认识

文章目录 什么是线程什么是进程进程的组成什么是pcb 进程概括线程线程与进程的关系线程的特点 创建线程创建线程方法创建线程的第二种方法对比 其他的方式匿名内部类创建线程匿名内部类创建Runable的子类lambda表达式创建一个线程 多线程的优势 什么是线程 什么是进程 首先想…

C++_day3:构造函数、析构函数、拷贝构造函数

1.设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 程序代码&#xff1a; #include <iostream>…

行业认可 | 海云安上榜《2024年网络与信息安全行业全景图》多个领域

近日&#xff0c;深圳市网络与信息安全行业协会正式发布《2024年网络与信息安全行业全景图》。海云安凭借过硬的技术实力及成熟的网络与信息安全产品及服务获得行业认可&#xff0c;入围6大类目共计17项细分领域。包括&#xff1a; 业务安全&#xff08;软硬件开发安全、人工智…