【计算机基础知识6】跨域问题及解决方案

news2024/9/21 2:36:53

目录

前言

一、什么是跨域问题?

二、为什么会出现跨域问题?

三、常见的跨域解决方法

1. JSONP(JSON with Padding)

2. CORS(跨域资源共享)

3. 代理服务器

4. postMessage()


前言

跨域是前端开发中经常遇到的一个重要问题。本文将详细介绍什么是跨域问题,为什么会出现跨域问题以及如何解决跨域问题。同时,还将通过代码举例来说明相关概念和解决方法。

一、什么是跨域问题?

跨域问题指的是在浏览器端发送 AJAX 请求时,请求的目标资源位于当前页面所在的域之外的情况。浏览器出于安全考虑,实施了同源策略(Same Origin Policy),即默认情况下不允许跨域请求。

同源策略要求 AJAX 请求的协议、端口和域名必须完全一致,否则就会被当作跨域请求。例如,假设当前页面的 URL 是 http://www.example.com,那么向 http://api.example.com 发送 AJAX 请求就会触发跨域问题。

二、为什么会出现跨域问题?

跨域问题的出现是为了保护用户数据和提高安全性。如果没有同源策略,恶意网站就可以在用户无感知的情况下获取到其他网站的数据,从而造成安全风险。

同源策略限制了跨域请求,但也带来了一些不便。比如,当我们需要从不同的域名获取数据或与其他域名进行通信时,就会面临跨域问题。

三、常见的跨域解决方法

1. JSONP(JSON with Padding)

JSONP 是一种跨域解决方案,它利用 <script> 标签的跨域特性来实现。在服务端将数据包装为回调函数的调用,然后通过动态创建 <script> 标签的方式引入,使得浏览器可以正确解析并执行返回的数据。

// 创建一个script标签  
var script = document.createElement('script');  
// 设置请求地址  
script.src = 'http://example.com/api/data?callback=myCallback';  
// 定义回调函数  
window.myCallback = function(data) {  
    console.log(data);  
};  
// 将script标签添加到文档中  
document.body.appendChild(script);

在这个例子中,我们通过动态创建script标签,将请求发送到不同的源http://example.com/api/data?callback=myCallback。在服务器端,它会返回一个JSON字符串,其中包含数据和回调函数名。在客户端,当script标签加载完成后,回调函数会被执行,从而获取到服务器返回的数据。

2. CORS(跨域资源共享)

CORS是一种通过浏览器和服务器进行协商的方法,允许不同源的网页之间进行通信。CORS通过在服务器端设置Access-Control-Allow-Origin等响应头来实现跨域。在客户端发送请求时,浏览器会自动携带一些请求头,如Origin等。

服务器根据这些请求头来判断是否允许跨域请求,如果允许,则在响应头中添加Access-Control-Allow-Origin等响应头。客户端在收到响应后,检查响应头中的Access-Control-Allow-Origin等响应头,如果允许跨域请求,则可以获取响应数据。

客户端发送请求时携带Origin头:

var xhr = new XMLHttpRequest();  
xhr.open('GET', 'http://example.com/api/data', true);  
xhr.setRequestHeader('Origin', 'http://mywebsite.com');  
xhr.onreadystatechange = function () {  
    if (xhr.readyState == 4 && xhr.status == 200) {  
        console.log(xhr.responseText);  
    }  
};  
xhr.send();

服务器端设置响应头允许跨域请求:

Access-Control-Allow-Origin: http://mywebsite.com

3. 代理服务器

代理服务器是跨域问题的另一种解决方案。前端应用程序将请求发送给自己的服务器,然后由服务器转发请求到其他域,最后将响应返回给前端。

例如,前端应用程序请求数据的 URL 是 /data,而实际数据位于 http://api.example.com/data。通过代理服务器,可以将前端请求发送到 /api/data,然后代理服务器负责将请求转发到 http://api.example.com/data,并将响应返回给前端。

代理跨域解决方案是最安全的跨域解决方案,它通过设置代理服务器来实现不同源之间的通信。下面是一个使用Node.js创建代理服务器的示例代码:

创建代理服务器:

const http = require('http');  
const url = require('url');  
  
const proxy = http.createServer((req, res) => {  
  let parsedUrl = url.parse(req.url);  
  let options = {  
    hostname: parsedUrl.hostname,  
    port: parsedUrl.port || 80,  
    path: parsedUrl.path,  
    method: req.method,  
    headers: req.headers  
  };  
  
  let proxyReq = http.request(options, (proxyRes) => {  
    proxyRes.on('data', (chunk) => {  
      res.write(chunk);  
    });  
    proxyRes.on('end', () => {  
      res.end();  
    });  
  });  
  req.pipe(proxyReq);  
  proxyReq.pipe(res);  
});  
  
proxy.listen(8080);

在这个例子中,我们使用Node.js创建了一个HTTP代理服务器,它将在本地的8080端口上监听请求。当客户端发送请求到代理服务器时,代理服务器会将请求的URL解析为对象,然后根据该URL对象创建新的HTTP请求,并将原始请求的请求头和请求体传递给新的HTTP请求。然后,代理服务器将新的HTTP请求发送到目标服务器,并将目标服务器的响应返回给客户端。

使用该代理服务器的示例代码:

var xhr = new XMLHttpRequest();  
xhr.open('GET', 'http://localhost:8080/api/data', true);  
xhr.onreadystatechange = function () {  
    if (xhr.readyState == 4 && xhr.status == 200) {  
        console.log(xhr.responseText);  
    }  
};  
xhr.send();

在这个例子中,我们将请求发送到本地的8080端口上的代理服务器,然后代理服务器将请求转发到目标服务器,并将目标服务器的响应返回给客户端。由于我们使用了代理服务器,所以可以绕过同源策略的限制,实现跨域。

4. postMessage()

如果前端应用程序需要与嵌入的 iframe 或跨窗口进行通信,可以使用 postMessage() 方法来发送跨域消息。

// 发送消息
otherWindow.postMessage('Hello', 'http://www.example.com');

// 接收消息
window.addEventListener('message', function(event) {
  if (event.origin === 'http://www.example.com') {
    // 处理接收到的消息
  }
});

上述代码中,otherWindow.postMessage() 方法用于向其他窗口发送消息,而 window.addEventListener('message', ...) 用于接收消息,并通过 event.origin 来判断消息来源是否为指定的域。

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

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

相关文章

2023高教社杯数学建模E题思路代码 - 黄河水沙监测数据分析

# 1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响&#xff0c; 以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位…

win11切换输入法快捷键怎么设置

win11系统有自动的切换输入法的快捷键&#xff0c;如果我们觉得系统默认的快捷键使用起来不习惯的话&#xff0c;我们可以将切换输入法的快捷键进行更改设置&#xff0c;这里小编就给大家带来win11输入法切换快捷键的设置方法&#xff0c;感兴趣的小伙伴快来看看吧。 win11输入…

企业变更记录查询API:解密企业演变的关键数据

前言 随着市场竞争的不断升级和商业环境的动态变化&#xff0c;企业必须不断适应新的情况和变革。在这个过程中&#xff0c;企业的变更记录成为了关键的数据&#xff0c;它可以帮助企业了解自己的发展历程、监测竞争对手的动态、评估市场趋势和满足法律法规的合规要求。为了解…

Fair|Fur —— Object Nodes

目录 Guide Groom Guide Deform Guide Merge Hair Generate Guide Simulate Hair Card Generate Guide Groom 从skin几何体生成引导线&#xff0c;并在其节点内可进一步处理引导线&#xff1b;内嵌Hair Generate节点&#xff1b; 注&#xff1a;skin几何体应是静态的&am…

关于一次blog性能测试的过程和疑问

找了搭建的一个博客网站&#xff0c;拿来试着测了测&#xff0c;想看一下性能能达到什么目标&#xff1b; 测试过程中遇到一些问题&#xff0c;还无法凭自己找到原因&#xff0c;测试过程记录下来&#xff0c;希望有热心大佬多多指教&#xff1b; 目录 基准测试场景 1、首页…

基于JAVA SSM框架和JSP的超市小卖部管理系统设计

摘要 随着时代的发展&#xff0c;传统的超市购物方式已经不能满足人们的需求&#xff0c;对于顾客来说&#xff0c;排队购物和支付购物费用的问题亟待解决。对于实体超市来说&#xff0c;他们面临着网上购物的竞争压力&#xff0c;作为超市经理&#xff0c;他们要降低成本&…

【C语言】初阶测试 (带讲解)

目录 ① 选择题 1. 下列程序执行后&#xff0c;输出的结果为( ) 2. 以下程序的输出结果是&#xff1f; 3. 下面的代码段中&#xff0c;执行之后 i 和 j 的值是什么&#xff08;&#xff09; 4. 以下程序的k最终值是&#xff1a; 5. 以下程序的最终的输出结果为&#xff…

hive中遇到length函数不支持bigint

背景 hive中遇到length函数不支持bigint 解决方法&#xff0c;sql转为string之后计算长度 SELECT COUNT(1) FROM ( select msisdn FROM tb_nrmr_sample_lt_dd_total where loc_time in (23090201,23090202,23090203,23090204,23090205,23090206) and length(cast(msisdn as…

2023年9月NPDP产品经理国际认证报名,来弘博创新

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

一种基于动态代理的通用研发提效解决方案

作为一名研发人员&#xff0c;除了业务开发之外&#xff0c;研发提效是一个永恒的话题&#xff0c;而女娲正是这一话题下进行的一次全面的剖析和实践。 作者&#xff1a;张全洪(钝悟) 一、女娲是什么 女娲是业务研发同学&#xff08;开发、测试、运维&#xff09;在软件迭代的…

高忆管理:军工板块走高,奥普光电涨停,恒宇信通等大涨

军工板块8日盘中发力走高&#xff0c;到发稿&#xff0c;晨曦航空、恒宇信通涨超12%&#xff0c;腾景科技涨逾11%&#xff0c;奥普光电涨停&#xff0c;霍莱沃、新余高科涨超7%。 对于该板块&#xff0c;组织表示&#xff0c;受职业增速下降以及“十四五”中期调整等不确定性因…

谈谈JSF业务线程池的大小配置 | 京东物流技术团队

1.简介 JSF业务线程池使用JDK的线程池技术&#xff0c;缺省情况下采用Cached模式&#xff08;核心线程数20&#xff0c;最大线程数200&#xff09;。此外&#xff0c;还提供了Fixed固定线程大小的模式&#xff0c;两种模式均可设置请求队列大小。 本文旨在通过一个简化场景&a…

如何利用python来提取SQL语句中的表名称

1.介绍 在某些场景下&#xff0c;我们可能需要从一个复杂的SQL语句中提取对应的表名称&#xff0c;在这样的场景下&#xff0c;我们如果在python中处理的话&#xff0c;就需要用到SQLparse这个库。 SQLparse 是一个用于解析 SQL 查询语句的 Python 库。它可以将复杂的 SQL 查询…

解决js计算小数不准的问题

1.使用计算函数 function accAdd(arg1, arg2) {var r1, r2, m;try { r1 arg1.toString().split(".")[1].length } catch (e) { r1 0 };try { r2 arg2.toString().split(".")[1].length } catch (e) { r2 0 };m Math.pow(10, Math.max(r1, r2));retur…

2023年9月北京/广州/深圳DAMA-CDGP数据治理专家认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

el-form表单中不同数据类型对应的时间格式化和校验规则

1. 在表单中, 当选择不同的数据类型时, 需要在下面选择时间时和数据类型对应上, 通过监听数据类型的变化, 给时间做格式化, 2. 但是当不按顺序选择数据类型后, 再选时间可能会报错, 所以需要在dom更新后, 再清空表单. 3. 校验规则, 结束时间需要大于开始时间, 但是不能选当前的…

报错ssh: Could not resolve hostname

…按照网上好多教程试了一下&#xff1a; 新建密钥&#xff0c;添加到gitee&#xff0c;重新测试。修改host&#xff0c;加入gitee的ip地址到里面去。修改.gifconfig配置文件&#xff0c;配置成ssh的仓库链接。 这上面的方法都不行&#xff0c;后面发现一篇文章&#xff1a;SS…

Spring 6.X IoC 容器

目录 一、Spring IoC 容器和 Bean 简介1.1、容器概述1.3、使用 一、Spring IoC 容器和 Bean 简介 下面主要介绍 Spring 框架对控制反转 (IoC) 原理的实现 首先要说明的是&#xff1a;IoC 也称为依赖注入&#xff0c;这是一个过程。 其次依赖项的定义&#xff1a;对象仅通过构造…

RSS订阅无需代码连接Outlook的方法

RSS订阅用户使用场景&#xff1a; 一家专门做书籍测评的企业&#xff0c;其日常工作中需要收集豆瓣上最受欢迎的书籍进行测评。为了确保测评的准确性和客观性&#xff0c;团队成员需要定期在Outlook上创建会议讨论新书&#xff0c;从不同角度对书籍进行深入剖析。然而&#xff…

Ansys Zemax | 如何将光线追迹结果导出为IES格式

照明系统设计者通常需要向客户提供IES格式的数据。照明工程学会 (Illuminating Engineering Society&#xff0c;IES) 文件格式便于传输辉度数据&#xff0c;该格式得到了制造商和设计师的广泛认可。本文描述了如何生成IES文件并验证结果。&#xff08;联系我们获取文章附件&am…