跨域问题(服务器和浏览器之间)待补充

一、为什么产生:

同源策略(域名,协议,端口),安全问题

二、怎么解决:

1、cros:修改响应头

2、+jp:采用js标签

3、+代理(创建服务器,定义规则,服务器与服务器之间不存在跨域问题)

当服务器提供解决方案时用前两种,不提供时用代理

跨域问题(Cross-Origin Resource Sharing, CORS)是前端开发中常见的问题,它发生在一个域的网页尝试访问另一个域的资源时。出于安全考虑,浏览器实施了同源策略(Same-Origin Policy),限制了来自不同源的文档或脚本间的交互。以下是几种常用的解决跨域问题的方法,每种方法都带有详细的步骤:

1. JSONP(JSON with Padding)

步骤:

  1. 创建一个回调函数:在前端页面定义一个回调函数,用于处理从服务器返回的数据。
  2. 发送请求 :通过<script>标签发送请求到服务器,请求中包含回调函数的名称。
  3. 服务器处理:服务器接收到请求后,将数据包装在回调函数中返回。
  4. 浏览器执行 :浏览器执行<script>标签中的脚本,触发回调函数,前端获取数据。

**优点:**兼容性好,几乎所有浏览器都支持。 **缺点:**只支持GET请求,安全性较低。

2. CORS(Cross-Origin Resource Sharing)

步骤:

  1. 发送预检请求(可选):浏览器先发送一个OPTIONS请求到服务器,询问是否可以进行实际请求。
  2. 服务器响应 :服务器在响应中设置Access-Control-Allow-Origin等头部,允许跨域访问。
  3. 发送实际请求:浏览器根据预检请求的响应决定是否发送实际请求。
  4. 服务器处理并响应:服务器处理请求并返回数据。

**优点:**支持各种HTTP请求方法,安全性高。 **缺点:**需要服务器端配置,可能需要后端开发人员介入。

3. 代理服务器

步骤:

  1. 设置代理服务器:在服务器端设置一个代理服务,用于转发前端的请求到目标服务器。
  2. 前端请求代理:前端发送请求到代理服务器。
  3. 代理服务器转发:代理服务器将请求转发到目标服务器。
  4. 获取响应:代理服务器将目标服务器的响应转发回前端。

**优点:**可以绕过浏览器的同源策略,适用于复杂场景。 **缺点:**增加了系统的复杂性,可能影响性能。

4. 窗口消息传递(Window.postMessage)

步骤:

  1. 创建iframe :在主页面中创建一个指向第三方网站的<iframe>
  2. 设置消息监听 :在<iframe>和主页面中分别设置监听器,监听message事件。
  3. 发送消息 :通过postMessage方法在<iframe>和主页面之间传递消息。

**优点:**可以实现跨源通信,不受限于同源策略。 **缺点:**需要第三方网站的配合,使用场景有限。

5. 文档域(document.domain)

步骤:

  1. 设置相同域 :两个不同子域的页面设置相同的document.domain属性。
  2. 共享数据:通过共享的域进行数据交互。

**优点:**适用于有相同主域但不同子域的情况。 **缺点:**只适用于具有相同主域的两个不同子域之间。

6. Webpack Dev Server 代理

步骤:

  1. 配置Webpack Dev Server:在Webpack开发服务器配置中设置代理规则。
  2. 前端请求:前端通过Webpack Dev Server发起请求。
  3. 代理转发:Webpack Dev Server将请求转发到目标服务器。

**优点:**开发环境中方便使用,无需服务器端配置。 **缺点:**仅限于开发环境,生产环境需要其他方案。

每种方法都有其适用场景和限制,开发者需要根据实际情况选择最合适的解决方案。

面试:

得分点

同源限制、协议、域名、端口、CORS、node中间件、JSONP、postmessage

标准回答

跨域:当前页面中的某个接口请求的地址和当前页面的地址如果协议、域名、端口其中有一项不同,就说该接口跨域了。

跨域限制的原因:浏览器为了保证网页的安全,出的同源协议策略。

跨域报错信息:

跨域解决方案

cors:目前最常用的一种解决办法,通过设置后端允许跨域实现。

res.setHeader('Access-Control-Allow-Origin', '*');

res.setHeader("Access-Control-Allow-Methods", "GET, PUT, OPTIONS, POST");

node中间件、nginx反向代理:跨域限制的时候浏览器不能跨域访问服务器,node中间件和nginx反向代理,都是让请求发给代理服务器,静态页面面和代理服务器是同源的,然后代理服务器再向后端服务器发请求,服务器和服务器之间不存在同源限制。

JSONP:利用的原理是script标签可以跨域请求资源,将回调函数作为参数拼接在url中。后端收到请求,调用该回调函数,并将数据作为参数返回去,注意设置响应头返回文档类型,应该设置成javascript。

postmessage:H5新增API,通过发送和接收API实现跨域通信。

加分回答

跨域场景:前后端分离式开发、调用第三方接口

相关推荐
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ7 分钟前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔2 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密2 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20152 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
卷福同学2 小时前
【养虾日记】QClaw操作浏览器自动化发文
运维·人工智能·程序人生·自动化
woho7788993 小时前
不同网段IP的网络打印机,打印、扫描设置
运维·服务器·网络
耗子会飞3 小时前
小白学习固定VM虚拟机的centos服务器的IP
运维·服务器·centos
门豪杰4 小时前
Ubuntu下安装Claude Code
linux·运维·ubuntu·claude·claude code
新新学长搞科研4 小时前
第五届电子、集成电路与通信技术国际学术会议(EICCT 2026)
运维·人工智能·自动化·集成测试·信号处理·集成学习·电气自动化
桌面运维家5 小时前
Windows/Linux双启动:BIOS/UEFI多配置桌面创建指南
linux·运维·windows