跨域问题经典解决方法

news2025/1/16 5:40:38

这里写目录标题

  • 背景
  • 步骤
    • 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">
	  <source
	     src="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.coloradmin.cn/o/1519250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[JavaWeb学习日记]Vue工程,springboot工程整合Mybatis,数据库索引

目录 一.Vue工程 安装NodeJS与Vue-cli Vue项目创建 启动Vue项目&#xff1a;点击npm脚本serve 改端口&#xff1a;在vue.config.js下 Vue文件组成&#xff1a;templatescriptstyle 使用element 前端服务器当前使用Ngix 主要编写的文件 二.SpringBoot的Web工程 启动带…

2024.3.15每日一题

LeetCode 卖木头块 题目链接&#xff1a;2312. 卖木头块 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你两个整数 m 和 n &#xff0c;分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices &#xff0c;其中 prices[i] [hi, wi, pricei] 表示你可以以…

被问了N遍的效率工具!批量自动添加好友

你还在手动输入客户号码或是微信号&#xff0c;再逐一进行搜索和添加吗&#xff1f; 现在有一个工具可以帮助你完成这项重复枯燥的工作任务&#xff0c;而且&#xff0c;这个工具不仅能够帮助你批量添加微信好友&#xff0c;更有很多自动化的功能&#xff0c;让你的办公效率得…

C语言宏定义问题

C语言中&#xff0c;在定义数组时&#xff0c;因为数组长度需要是常量或者宏&#xff0c;尝试将变量按照值不同定义同一个宏的不同值&#xff0c;然后用宏来定义数组长度&#xff0c;结果发现不行。原来C的宏定义&#xff0c;是不能重复的&#xff0c;下面是ChatGPT给的答案&am…

【HyperLips:】数字人——控制嘴唇 项目源码python实现

最近受到商汤“复活”汤晓鸥的视频刺激&#xff0c;大大的amazing&#xff01;没看过的小伙伴可以自行百度&#xff0c;看了不研究一下【数字人】技术&#xff0c;都要跟时代脱轨了&#xff0c;那就以HyperLips为开篇吧。 目录 &#x1f34e;&#x1f34e;1.摘要 &#x1f3…

python创建虚拟环境-Anaconda安装配置和使用

Anaconda提供了一个名为conda的包管理工具&#xff0c;可以方便地创建、管理和分享Python环境。用户可以根据自己的需要创建不同的环境&#xff0c;每个环境都可以拥有自己的Python版本、库和依赖项&#xff0c;这样就可以避免因为不同项目之间的依赖关系而导致的冲突问题。 一…

数据集成平台选型建议

一 数据集成介绍 数据集成平台是一种用于管理和协调数据流动的软件工具或服务。它的主要目标是将来自多个不同数据源的数据整合到一个统一的、易于访问和分析的数据存储库中。这些数据源可以包括数据库、云应用、传感器、日志文件、社交媒体等等。数据集成平台的关键任务是确保…

外卖平台订餐流程架构的实践

当我们想要在外卖平台上订餐时&#xff0c;背后其实涉及到复杂的技术架构和流程设计。本文将就外卖平台订餐流程的架构进行介绍&#xff0c;并探讨其中涉及的关键技术和流程。 ## 第一步&#xff1a;用户端体验 用户通过手机应用或网页访问外卖平台&#xff0c;浏览菜单、选择…

数字信封

一、概念 数字信封是将对称密钥通过非对称加密&#xff08;即&#xff1a;有公钥和私钥两个&#xff09;的结果分发对称密钥的方法。数字信封是实现信息保密性验证的技术。 二、过程描述 在数字信封中&#xff0c;信息发送方采用对称密钥来加密信息内容&#xff0c;然后将此…

nut-ui组件库icon中使用阿里图标

1.需求 基本每个移动端组件库都有组件 icon组件 图标组件、 但是很多组件库中并找不到我们需要的图标 这时候 大家有可能会找图标库 最大众的就是iconfont的图标了 2.使用 有很多方式去使用这个东西 比如将再限链接中的css引入 在使用 直接下载图标 symbol 方式 等....…

商家转账到零钱转账场景说明指导

商家转账到零钱是什么&#xff1f; 商家转账到零钱功能是指商家可以通过支付平台将资金直接转账到用户的零钱账户中。在这种情况下&#xff0c;商家不需要用户提供银行账户信息&#xff0c;而是使用支付平台的转账功能将资金直接转移到用户的零钱账户中。 商家转账到零钱的使…

SpringBoot(依赖管理和自动配置)

文章目录 1.基本介绍1.springboot是什么&#xff1f;2.快速入门1.需求分析2.环境配置1.确认开发环境2.创建一个maven项目3.依赖配置 pom.xml4.文件目录5.MainApp.java &#xff08;启动类&#xff0c;常规配置&#xff09;6.HelloController.java &#xff08;测试Controller&a…

基于DataX迁移MySQL到OceanBase集群

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库

Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库 在Windows中使用C#连接Mysql数据库比较简单&#xff0c;可以直接使用MySql.Data库&#xff0c;目前最新版本为&#xff1a;8.3.0。 当然也可以结合MySql.Data和Dapper库一起使用&#xff0c;目前Dapper的最新版本为&a…

rancher里的ingress如何配置gzip压缩

方案一&#xff0c;未试验成功&#xff0c;但配置过程值得记录一下 通过配置configmap&#xff0c;然后在ingress的deployment里引用configmap实现。 参考文章 创建configmap apiVersion: v1 kind: ConfigMap metadata:name: nginx-ingress-controllerannotations:{} # k…

【C++算法模板】图论-拓扑排序,超详细注释带例题

文章目录 0&#xff09;概述1&#xff09;Kahn算法1&#xff1a;数据结构2&#xff1a;建图3&#xff1a;Kanh算法 2&#xff09;DFS染色1&#xff1a;数据结构2&#xff1a;建图3&#xff1a;DFS 3&#xff09;算法对比【例题】洛谷 B3644 推荐视频链接&#xff1a;D01 拓扑排…

力扣串题:反转字符串中的元音字母

​​​​​​​ 双指针&#xff0c;注意判断是否为元音的操作 bool IsVowel(char s){if(sa||se||si||so||su||sA||sE||sI||sO||sU) return true;return false; }char * reverseVowels(char * s){int len strlen(s),i0;while(i<len-1){if(IsVowel(s[i])&&IsVowel(s…

谷粒商城——分布式基础(全栈开发篇第一部分)

文章目录 一、服务治理网路数据支撑日志处理ELK应用监控集成工具开发工具 二、环境创建1、虚拟机创建2、虚拟机安装docker等1. 安装docker1. 配置阿里docker3.docker安装mysql错误 4、docker安装redis 3、软件1.Maven 阿里云镜像1.8jdk2、idea lombokmybatisX &#xff0c;3、 …

使用CIP采集欧姆龙EtherNet/IP从入门到精通

本文将会从以下几个方面介绍 1.CIP是什么 2.EtherNet/IP通信是什么 3.CIP通信报文解析 4.使用CIP常用的方法和功能介绍&#xff08;UCMM&#xff09; 5.自己封装了一个类&#xff0c;只要知道标签名称&#xff0c;和数据类型即可读写数据 6.demo展示 1.CIP是什么 CIP通信…

操作多级(一、二、三级)指针才是我们的该有的姿态~

Hello&#xff0c;很有缘在这篇文章上我们相遇了&#xff0c;那么我就用题目巩固我们多级指针的知识&#xff0c;当然这里的题目是比较有点难度的&#xff0c;我们需要有点基础呀&#xff0c;如果你能轻松理解题目那说明你对指针的了解已经很有基础了呢&#xff0c;那废话不多说…