js实现跨域的几种方法汇总(图片ping、JSONP和CORS)

概述

跨域是指在同源策略限制下,客户端无法向不同源(协议、域名、端口)的服务器发送请求。但有些情况下需要跨域请求,这时可以使用以下几种方法:图片ping、JSONP和CORS。

方法一:图片ping

通过创建一个HTML的日志资源文件来达到跨域目的,将数据转化为图片地址,然后请求这个图片地址。

<img src="http://example.com/?data=[data]" />

这样发送是不会中止请求的,即使服务器不支持任何的输出形式。

优缺点:
- 优点:对浏览器兼容性要求较低,一般都可以完成跨域操作。
- 缺点:只能使用 GET 请求方式,并且无法设置请求头,只能从服务器拿到请求成功或失败的结果,且不能获得服务端返回的数据。

方法二:JSONP

JSONP 全称为 JSON with Padding,简单来说就是在js里面执行函数,为什么要用padding呢?因为 JSONP其实是利用<script>标签来实现的,可以被普通的浏览器进行跨域访问的特性,这种格式的数据很难实现由 JSON 转译成 JSONP,因此使用了这种 hack 的方式。padding其实是指要在服务端将JSON数据填入到一对用户定义的函数调用中(函数名在URL中),从而构成JS文件(JSONP文件)。

假设客户端需要从 http://example.com/?callback=func 这个URL获取数据,并且要求接口返回的数据格式为 callback(data)

function func(data) {
  console.log(data)
}

const script = document.createElement('script')
script.src = 'http://example.com/?callback=func'
document.head.append(script)

在这个js文件中,会向服务器发送一个 URL 请求,并且 URL 中包含一个名为callback的参数,这个参数的值就是要获得 JSON 数据之后要立即调用的函数名,在服务器端将数据放进其中,并返回这个 js 文件内容,客户端浏览器接收到这个js文件之后,会自动执行func(data)函数。

优缺点:
- 优点:能跨域请求跨域数据,不受同源策略限制,支持 GET 请求,可以向服务端发送请求时设置请求头。
- 缺点:只支持 GET 请求,并且必须判断响应的数据格式,需要服务端配合,且容易受到XSS攻击。

方法三:CORS

CORS 全称为 Cross-Origin Resource Sharing,是 HTML5 提供的一种机制,采用额外的 HTTP 头来告诉浏览器,以允许 Web 应用程序访问不属于其来源的选定资源,浏览器会对复杂请求(例如:get/post以及POST的两种Content-Type:application/json,application/x-www-form-urlencoded)发起一次预检,可以看做是一次请求前置确认,服务器返回“METHOD,Origin,Accept-language,Accept”等字段,携带带校验信息,让浏览器放行实际的请求。

在服务器端,需要添加如下响应头:

Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: POST,GET,OPTIONS
Access-Control-Max-Age: 1000
Access-Control-Allow-Headers: Content-Type, Authorization

在客户端,直接发送 AJAX 请求,浏览器会自动在请求头中添加Origin字段发起预检请求,如果服务器支持跨域,会返回以上响应头信息。

const xhr = new XMLHttpRequest()
xhr.open('POST', 'http://example.com/api')
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.setRequestHeader('Authorization', 'Bearer ' + token)
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4 && xhr.status === 200) {
    console.log(xhr.responseText)
  }
}
xhr.send(JSON.stringify({data: 'some data'}))

优缺点:
- 优点:绝大多数浏览器都支持,以标准化的请求头、状态码、请求方法来对跨域请求和响应进行规范,同时支持 GET/POST 等请求方式。
- 缺点:需要服务器端进行配置,在某些第三方库中并不支持 CORS。

示例一

通过JSONP方式从服务器获取数据。

服务端随意设置一个接口,返回数据。

const express = require('express')
const app = express()

app.get('/jsonp', (req, res) => {
  const callback = req.query.callback
  const data = {a: 1, b: 2, c: 3}
  res.send(`${callback}(${JSON.stringify(data)})`)
})

app.listen(3000, () => console.log('listening on port 3000'))

客户端通过JSONP跨域获取数据,代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>JSONP Demo</title>
</head>
<body>
  <script>
    function handleData(data) {
      console.log(data)
    }

    const script = document.createElement('script')
    script.src = 'http://localhost:3000/jsonp?callback=handleData'
    document.head.append(script)
  </script>
</body>
</html>

示例二

通过CORS方式从服务器获取数据。

服务端随意设置一个接口,返回数据。

const express = require('express')
const app = express()

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*')
  res.header('Access-Control-Allow-Methods', 'GET,POST,OPTIONS')
  res.header('Access-Control-Allow-Headers', 'Origin,Content-Type,Authorization')
  next()
})

app.post('/cors', (req, res) => {
  const data = req.body
  res.json(data)
})

app.listen(3000, () => console.log('listening on port 3000'))

客户端通过 AJAX 跨域获取数据,代码如下所示:

const xhr = new XMLHttpRequest()
xhr.open('POST', 'http://localhost:3000/cors')
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.setRequestHeader('Authorization', 'Bearer ' + token)
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4 && xhr.status === 200) {
    console.log(xhr.responseText)
  }
}
xhr.send(JSON.stringify({data: 'some data'}))

结语

以上三种方法均可用于跨域请求,但不同的请求方式适用于不同的场景,需要根据实际业务情况选择。而若是自身网站项目,建议使用第三种CORS方式,若要集成第三方传输库则可考虑JSONP方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现跨域的几种方法汇总(图片ping、JSONP和CORS) - Python技术站

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

相关文章

  • 云计算的背水一战!核心技术决定未来! – 金色小蜜蜂

    云计算的背水一战!核心技术决定未来!   云计算的背水一战!核心技术决定未来!   最近国内各IT巨头技术布局都颇有看点,先是腾讯宣布将投入5000亿,用于新基建的进一步布局(将重点投入云计算、人工智能、区块链、服务器、大型数据中心等技术);阿里再投2000亿入新基建,并成立XG实验室,正式入局5G领域;华为发布企业级AI应用开发套件ModelArt Pro…

    云计算 2023年4月13日
    00
  • 阿里云为啥要像O2O一样烧钱?

    阿里云为啥要像O2O一样烧钱? 阿里云是阿里巴巴集团下属的云计算服务商,与其他云计算公司相比,如AWS和Azure,在国内市场上占据着相当大的份额。然而,阿里云近年来在扩大市场份额时注入了大量资金,给人们留下了“像O2O一样烧钱”的印象。 阿里云投入资金的原因 市场占有率增长需要 阿里云市场份额的快速增长很大程度上是通过大规模的投资来实现的。阿里云之所以要投…

    云计算 2023年5月17日
    00
  • ASP.NET的Core AD域登录过程示例

    下面是关于“ASP.NET Core AD域登录过程示例”的完整攻略,包含两个示例说明。 简介 在ASP.NET Core中,我们可以使用Active Directory(AD)域来实现用户身份验证和授权。AD域是一种基于Windows Server的目录服务,它可以存储和管理用户、计算机和其他网络资源的信息。在本攻略中,我们将演示如何在ASP.NET Co…

    云计算 2023年5月16日
    00
  • 云计算服务的三种类型(SaaS、PaaS、IaaS)

    云计算可以帮助企业降低IT方面的成本和复杂性,并获得他们蓬勃发展所需的灵活性与敏捷性。但是,规划出通往云的明确路径并非易事。毕竟用户需要看透与云相关的市场大肆宣传,然后理解并分析不同种类的云计算模式的优点与缺点。此外,还需要确定备选的云中哪些最适合自己企业的战略、工作负载、性能、安全性需求和内部IT的专业知识,甚至希望将来某一刻可以完全地“Do it you…

    云计算 2023年4月13日
    00
  • 最佳案例 | 游戏知几 AI 助手的云原生容器化之路

    作者 张路,运营开发专家工程师,现负责游戏知几 AI 助手后台架构设计和优化工作。 游戏知几 随着业务不断的拓展,游戏知几AI智能问答机器人业务已经覆盖了自研游戏、二方、海外的多款游戏。游戏知几研发团队主动拥抱云原生,推动后台业务全量上云,服务累计核心1w+。 通过云上的容器化部署、自动扩缩容、健康检查、可观测性等手段,提高了知几项目的持续交付能力和稳定性,…

    2023年4月9日
    00
  • python数据库操作–数据库使用概述

    下面我将为你详细讲解 Python 数据库操作的数据库使用概述。 简介 Python 作为一门语言,具有强大的数据处理能力,因此在数据处理、数据分析等领域都有着广泛的应用。而常见的数据存储方式,就是使用数据库。Python 支持与多种数据库交互,例如 MySQL、SQLite、Oracle 等。 在 Python 中操作数据库需要使用到特定的库,常见的有 p…

    云计算 2023年5月18日
    00
  • 高考要来啦!用Python爬取历年高考数据并分析

    让我们来详细讲解“高考要来啦!用Python爬取历年高考数据并分析”的完整攻略。 1. 确定需求 首先,我们要明确需要获取哪些历年高考数据,比如考生人数、平均分、最高分、最低分等等。同时还需要确定获取的数据范围,比如年份、科目等。 2. 确定数据源 接下来,我们需要确定从哪里获取历年高考数据。通常来说,我们可以选择从网站上获取,这里推荐使用教育部考试中心网站…

    云计算 2023年5月18日
    00
  • asp.net(C#)跨域及跨域写Cookie问题

    下面是关于“ASP.NET(C#)跨域及跨域写Cookie问题”的完整攻略,包含两个示例说明。 简介 在ASP.NET(C#)应用程序中,我们经常需要处理跨域请求和跨域写Cookie问题。在本攻略中,我们将介绍如何在ASP.NET(C#)应用程序中处理跨域请求和跨域写Cookie问题,并提供两个示例说明。 步骤 在ASP.NET(C#)应用程序中处理跨域请求…

    云计算 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部