JavaScript跨域方法汇总

JavaScript跨域方法汇总

跨域是指在浏览器中执行的 JavaScript 代码不能够访问其它来源的数据。常见的场景是:当前页面代码想要请求第三方接口数据,但是该接口数据不允许跨域访问,导致请求失败。为了解决这种情况,我们需要使用跨域方法。

本文将介绍几种常用的 JavaScript 跨域方法,以及它们的优缺点。

1. JSONP

JSONP 是一种跨域方法,它利用了 HTML script 标签的跨域能力,实现了跨域请求数据的功能。

具体实现过程:

  1. 定义一个全局函数
  2. 创建一个 script 标签,src 属性指向目标接口,同时在该 URL 中将要执行的回调函数的名称通过查询参数的方式传递过去
  3. 当该 script 标签加载完毕后,目标接口会直接调用该回调函数,在回调函数中将需要的数据作为参数传递给函数
  4. 在全局函数中对数据进行处理

JSONP 的优点在于它比较简单,只需要对接口返回的数据进行处理即可,跨域实现方式比较简单。但它的缺点是,只能使用 GET 方法,无法支持 POST、DELETE 等 HTTP 方法。

示例1

假如我们想要获取必应搜索中搜索 “JavaScript” 的结果,需要使用 JSONP。

  1. 先定义一个全局函数 handleData

javascript
function handleData(data) {
console.log(data);
}

  1. 创建 script 标签,src 设置为拼接后的必应搜索接口地址,将回调函数名称设置为 handleData,然后添加到 DOM 中。

javascript
const script = document.createElement("script");
script.src = `https://api.bing.com:443/qsonhs.aspx?action=web.qs&query=JavaScript&cp=1&cs=1&cb=handleData`;
document.body.appendChild(script);

2. CORS

CORS 是一种跨域方法,它通过在服务端设置 Access-Control-Allow-Origin 响应头实现了在浏览器中跨域访问接口数据。

具体实现过程:

  1. 客户端发起 AJAX 请求
  2. 服务器端设置允许跨域请求的响应头,包括 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers 等字段
  3. 如果客户端发送的 AJAX 请求包含 cookie 等敏感数据,则需要在 AJAX 请求中添加参数 withCredentials: true,同时服务器端需要设置 Access-Control-Allow-Credentials 响应头为 true

CORS 的优点在于可以实现完整的 HTTP 请求方式,而且支持 cookie 等敏感信息的传递。但它的缺点是需要服务端设置响应头。

示例2

假如我们想要使用 AJAX 请求 GitHub 上的仓库信息,需要使用 CORS。

const xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.github.com/repos/facebook/react", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    const data = JSON.parse(xhr.responseText);
    console.log(data);
  }
};
xhr.send();

3. 代理

代理是一种跨域方法,它在服务端进行请求转发,并将接口数据返回给客户端。

具体实现过程:

  1. 客户端发起 AJAX 请求
  2. 服务器端代理该请求,向目标接口发起请求,并将目标接口返回的数据返回给客户端
  3. 客户端对接口返回的数据进行处理

代理的优点在于可以实现较为复杂的请求逻辑,而且不需要在客户端进行跨域处理。但它的缺点是需要在服务端实现请求转发。

示例3

假如我们想要使用 AJAX 请求 Google Search 上的关键词提示信息,但是它不允许跨域访问。我们可以借助代理实现请求转发。

  1. 先编写服务器代理脚本,向目标接口发起请求,并将目标接口返回的数据返回给客户端

```javascript
const express = require("express");
const axios = require("axios");
const app = express();

app.get("/suggest", async (req, res) => {
const { query } = req.query;
const response = await axios.get("https://www.google.com/complete/search", {
params: {
q: query,
cp: 0,
client: "psy-ab"
}
});
res.json(response.data);
});

app.listen(3000, () => {
console.log("Server Started...");
});
```

  1. 在客户端发起 AJAX 请求

javascript
const xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:3000/suggest?query=JavaScript", true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
const data = JSON.parse(xhr.responseText);
console.log(data);
}
};
xhr.send();

以上就是本文介绍的 JavaScript 跨域方法,包括 JSONP、CORS 和代理三种方式,同时也提供了两个示例:使用 JSONP 实现必应搜索接口的跨域访问和使用代理实现谷歌搜索关键词提示信息的跨域访问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript跨域方法汇总 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript函数的使用详解

    JavaScript函数的使用详解 JavaScript中的函数是一组语句,用于执行特定任务或计算值。通过函数,我们可以以可重用的方式组织代码,并将复杂的操作拆分为小的模块。在本文中,我们将介绍JavaScript函数的使用方法,包括函数定义、函数调用、传递参数、返回值等。 函数的定义 JavaScript的函数可以通过函数声明、函数表达式以及箭头函数等方式…

    JavaScript 2023年5月27日
    00
  • electron 安装,调试,打包的具体使用

    接下来我将详细讲解如何使用Electron进行安装、调试和打包。整个过程分为如下几个步骤。 安装 Electron可以通过npm进行安装,以下是安装命令: npm install electron –save-dev 其中,–save-dev选项会将Electron保存为开发依赖。如果你想在全局范围内使用Electron,则需要使用以下命令进行全局安装:…

    JavaScript 2023年6月11日
    00
  • JavaScript的Function详细

    JavaScript的Function详细攻略 什么是函数 函数是一段能够完成特定任务的可重复使用的代码。它们可以接受输入和返回输出。 在JavaScript中,函数是一等公民,这意味着它们被认为是值,并且可以作为参数传递给其他函数或由其他函数返回。 函数定义如下所示: function functionName(parameter1, parameter2…

    JavaScript 2023年5月18日
    00
  • javascript:;与javascript:void(0)使用介绍

    当我们在HTML中使用”href”属性来定义一个链接时,有时会使用”javascript:”或”javascript:void(0)”作为链接的href值。这两个值虽然都可以用来防止页面跳转,但它们的作用是有所不同的。 “javascript:;” “javascript:;”这个值通常用来防止a标签产生默认跳转行为,因为当a标签的href属性的值为空时,点…

    JavaScript 2023年5月17日
    00
  • Date对象格式化函数代码

    下面是详细的“Date对象格式化函数代码”的攻略: 什么是Date对象 Date对象是JavaScript的内置对象之一,用于表示日期和时间,可以获取当前时间、创建指定日期时间的对象、设置日期时间等操作。该对象拥有一些常用的方法,例如getDate()、getFullYear()、getMonth()等,用于获取日期和时间中的具体值。 Date对象格式化函数…

    JavaScript 2023年6月10日
    00
  • JavaScript实现数组去重的7种方法

    JavaScript实现数组去重的7种方法 在JavaScript中,实现数组去重是一个常见的需求。下面介绍7种实现数组去重的方式。 1.使用 Set 使用ES6中的Set对象可以方便地实现数组去重,使用Set之后,将数组转换为Set之后,再将Set转换为数组即可。 const arr = [1, 2, 1, 2, 3] const newArr = Arr…

    JavaScript 2023年5月27日
    00
  • Javascript中的arguments对象

    Javascript中的arguments对象 在Javascript中,函数参数可以通过arguments对象访问。这个对象是一个类数组对象,包含了函数调用时所有传入的实参,可以用来访问函数调用时没有在形参列表中声明的参数。 arguments对象的基本用法 arguments对象有如下属性和方法: 属性 callee: 返回当前正在执行的函数的引用,一般…

    JavaScript 2023年5月27日
    00
  • javascript显示用户停留时间的简单实例

    JavaScript 显示用户停留时间的简单实例 在网页开发中,我们有时需要知道用户在页面上停留的时间。今天我们就来分享一下如何通过 JavaScript 显示用户停留时间的简单实例。 思路: 1.获取当前时间 2.当用户进入页面时开始记录时间 3.当用户离开页面时,计算时间差 4.将时间差显示在页面上 示例1:采用 Date() 对象获取时间 <!D…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部