JS跨域解决方案之使用CORS实现跨域

下面进行详细讲解“JS跨域解决方案之使用CORS实现跨域”的完整攻略。

什么是跨域?

在Web中,通常浏览器执行JavaScript脚本是受到同源策略的限制,即一个源(域名、协议、端口)下的文档或脚本,无法访问另一个源下的资源。这种限制被称为“跨域”。

CORS的介绍

CORS(Cross-Origin Resource Sharing)即跨源资源共享,是一种机制,允许位于一个域名下的Web应用请求访问另一个域名下的资源。该机制在许多现代浏览器中被实现,使得web应用可以通过在服务端设置一些特定的HTTP头来完成跨域的访问控制。

CORS的使用方法

服务器端的配置

在服务端,可以通过设置Response Header,来控制CORS访问。最主要的设置是Access-Control-Allow-Origin这个Header。

当客户端发起请求时,服务端响应这个请求,如果设置了Access-Control-Allow-Origin Header,并且该Header的值允许了客户端的域名,则该请求将得到响应。以下是允许所有域名的配置。

Access-Control-Allow-Origin: *

还有其他一些Header需要设置,例如:

  • Access-Control-Allow-Headers:指定了由浏览器允许发送的Header列表。
  • Access-Control-Expose-Headers:指定了响应中暴露给前端JavaScript的Header列表。

服务器端示例代码如下:

const http = require('http');

http.createServer((request, response) => {
  // 设置允许跨域的源
  response.writeHead(200, {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Headers': 'Content-Type',
    'Access-Control-Expose-Headers': 'Token',
  });

  response.end('Hello CORS');
}).listen(3000);

客户端的请求

客户端向服务端请求时,需要设置withCredentials=true,将Cookie带上,否则服务端无法获取到Cookie。

客户端所在的源既可以是HTTP,也可以是HTTPS。

客户端示例代码如下:

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.open('GET', 'http://example.com:3000');
xhr.onload = function() {
  console.log('Response from CORS', xhr.responseText);
};
xhr.send(null);

进一步说明

通常,跨域的解决方案还有JSONP等方法,但CORS可以算是现代浏览器默认的跨域解决方案了。当然,CORS也有一些限制和必要的安全考虑,需要结合实际情况进行使用。

示例说明:

下面给出两个使用CORS的实例说明。

  1. 前端向服务端请求数据

在客户端发送请求时,需要将withCredentials设置为true,以便服务端能够获取到请求中的Cookie。

客户端代码:

fetch('http://example.com:3000/data', {
  method: 'GET',
  credentials: 'include'
})
.then(res => res.json())
.then(data => {
  console.log('Response from server', data);
})
.catch(err => {
  console.error(err);
});

服务端代码:

const http = require('http');

http.createServer((req, res) => {
  if (req.url === '/data') {
    res.writeHead(200, {
      'Access-Control-Allow-Origin': 'http://example.com:8000',
      'Access-Control-Allow-Credentials': 'true'
    });
    res.end(JSON.stringify({
      name: 'hello'
    }));
  }
}).listen(3000);

当客户端向服务端请求时,服务端将Access-Control-Allow-Origin设置为'http://example.com:8000',这样只有来自'http://example.com:8000'域名的请求才能访问服务端资源。

  1. 浏览器访问数据接口

通过服务端设置Access-Control-Allow-Origin,可以让浏览器跨域读取服务端返回的数据。

客户端代码:

http://example.com:3000/data

这样浏览器就可以访问'http://example.com:3000/data'这个接口,并且从Response Header中获取到Access-Control-Allow-Origin的值。

服务端代码:

const http = require('http');

http.createServer((req, res) => {
  if (req.url === '/data') {
    res.writeHead(200, {
      'Access-Control-Allow-Origin': 'http://example.com:8000'
    });
    res.end(JSON.stringify({
      name: 'world'
    }));
  }
}).listen(3000);

当浏览器请求'http://example.com:3000/data'时,服务端将Access-Control-Allow-Origin设置为'http://example.com:8000',使浏览器可以跨域读取数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS跨域解决方案之使用CORS实现跨域 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 华尔街上最炙手可热的三门编程语言

    当今世界,金融业已经成为计算机编程的重要领域之一。为了更好地支持各类金融计算和交易,许多特定的编程语言也应运而生。在这些语言中,应用最为广泛的三门编程语言分别是Python、R和MATLAB。 Python Python是目前非常火热的编程语言之一。它优雅、易读易懂、语法简洁,并已经成为金融计算领域的首选。Python 在量化交易、风险管理、股票分析和计算机…

    云计算 2023年5月18日
    00
  • 通过雾计算和边缘计算完成云计算丨边缘计算阅读周

    #边缘计算阅读周#  读书的人,有梦可做。 边缘计算社区联合6大出版社邀您一起阅读,一起做追梦人。 今天推荐的书是机械工业出版社推出的《雾计算与边缘计算:原理及范式》,这本书探讨了可扩展架构开发、从封闭系统转变为开放系统以及数据感知引起的道德问题等主题,以应对雾计算和边缘计算带来的挑战和机遇。 以下为书里的部分篇章,阅读一下,文末有惊喜。 通过雾计算和边缘计…

    云计算 2023年4月13日
    00
  • 区块链CHAT是什么币?CHAT币官网总量和上架交易所介绍

    区块链CHAT是什么币? 区块链CHAT是一种基于区块链技术的数字货币,它的全称是ChatCoin。CHAT币的官网是https://www.openchat.co/,总量为21亿枚。CHAT币已经上架了多个交易所,包括Binance、Huobi、Gate.io等。 CHAT币的特点 CHAT币的特点如下: 基于区块链技术,具有去中心化、安全、透明等特点。 …

    云计算 2023年5月16日
    00
  • C#中#define后面只加一个参数的解释

    下面是关于“C#中#define后面只加一个参数的解释”的完整攻略,包含两个示例说明。 简介 在C#中,我们可以使用#define指令来定义编译时常量。当我们在代码中使用了#define指令后,编译器会将指定的常量替换为对应的值。在本攻略中,我们将介绍在C#中使用#define后面只加一个参数的解释,包括如何定义和使用编译时常量。 步骤 在C#中使用#def…

    云计算 2023年5月16日
    00
  • MVC4制作网站教程第一篇 绪论

    我来详细讲解“MVC4制作网站教程第一篇 绪论”的完整攻略。 一、教程介绍 本教程将介绍如何使用MVC4制作网站。MVC是Model-View-Controller的缩写,它是一种软件架构模式,常用于构建Web应用程序。MVC4是ASP.NET MVC的一个版本,提供了一种优雅的方式来编写Web应用程序,以及使用HTML、CSS、JavaScript和.NE…

    云计算 2023年5月17日
    00
  • “创新雷神号”卫星成功发射,华为云分布式云原生“天地一体”首次组网成功

    2022年2月27日,我国在文昌发射场使用长征八号运载火箭,以“1箭22星”方式,成功将“创新雷神号”卫星等共22颗卫星发射升空。卫星主要用于提供商业遥感信息、海洋环境监测、森林防火减灾等服务。其中“创新雷神号” 作为“天算星座”计划的第二颗先导试验星,主要基于由北京邮电大学、华为云、北京大学联合研制的星地融合分布式网络验证平台开展试验验证。 “天算星座”计…

    云计算 2023年4月10日
    00
  • 阿里云:计算将成DT世界引擎

    阿里云发布了一篇题为“计算将成DT世界引擎”的博客,其主要内容包括以下几个方面: 什么是DT世界 DT,即“数字化转型”的英文首字母缩写,指的是将数字技术应用于企业内部各个业务环节,实现数字化升级和转型的过程,是数字化时代企业发展的必经之路。 什么是DT引擎 DT引擎是支撑DT世界建设的系统性技术,是各类数字技术在企业内部的应用平台,可以通过多个层次实现数字…

    云计算 2023年5月17日
    00
  • 云计算、虚拟化和容器

    “云计算”这个词,相信大家都非常熟悉。 作为信息科技发展的主流趋势,它频繁地出现在我们的眼前。伴随它一起出现的,还有 这些概念名词—— OpenStack、Hypervisor、KVM、Docker、K8S… 这些名词概念,全部都属于云计算技术领域的范畴。 对于初学者来说,理解这些概念的具体含义并不是一件容易的事情。 所以,小枣君今天这篇文章,将 给大家…

    2023年4月10日
    00
合作推广
合作推广
分享本页
返回顶部