JavaScript跨域方法汇总

yizhihongxing

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日

相关文章

  • webpack 3.X学习之多页面打包的方法

    webpack 3.X学习之多页面打包的方法 前言 在实际我们的开发中可能需要构建多个页面,对于我们的前端项目而言,在每个页面之间进行切换和操作,需要单独的代码对其进行处理。webpack 提供了一种分离应用程序的方法,将公共的部分提取出来成为一个单独的块,用以支持多页面的单独加载,减小了每个页面所需的代码量,提高代码加载速度。 创建一个项目 我们先创建一个…

    JavaScript 2023年6月10日
    00
  • js实现秒表计时器

    实现 js 的秒表计时器功能,可以按照以下步骤进行: 1. 创建页面结构 页面需要包含一个显示时间的区域和三个按钮,分别是“开始计时”、“暂停计时”和“重置计时”按钮。按钮可以使用 button 标签创建,显示时间的区域可以使用 div 标签创建。 下面是一个简单的页面结构示例: <div id="clock">00:00:0…

    JavaScript 2023年5月27日
    00
  • JavaScript新增的两个原始数据类型详解(Record和Tuple)

    JavaScript新增的两个原始数据类型详解(Record和Tuple) 概述 在ES2021(ES12)中,JavaScript新增了两个原始数据类型:Record(记录)和Tuple(元组)。原始数据类型是指JavaScript内置数据类型,包括number、string、boolean、null、undefined、symbol和BigInt。 Re…

    JavaScript 2023年5月28日
    00
  • js中DOM三级列表(代码分享)

    JS中DOM三级列表(代码分享) 在HTML中,可以通过嵌套使用<ul>和<li>标签来创建无序列表,也可以嵌套使用<ol>和<li>标签来创建有序列表。除此之外,还可以通过嵌套使用<dl>、<dt>和<dd>标签来创建说明列表。在JavaScript中,可以使用DOM操作来…

    JavaScript 2023年6月10日
    00
  • Javascript Math ceil()、floor()、round()三个函数的区别

    当我们需要将浮点数向上或向下取整时,可以使用 Javascript 中的 Math 对象提供的 ceil()、floor() 和 round() 三个函数。它们的区别如下: Math.ceil() Math.ceil() 方法返回一个大于或等于所传入数字的最小整数,即向上取整。如果传入的是整数,则返回该整数本身。 示例: Math.ceil(4.3); //…

    JavaScript 2023年5月27日
    00
  • C#基于正则表达式实现获取网页中所有信息的网页抓取类实例

    C#基于正则表达式实现获取网页中所有信息的网页抓取类实例 1. 前言 网页抓取是实现自动化数据采集、分析和处理的重要手段之一。本篇文章将介绍使用C#基于正则表达式实现获取网页中所有信息的网页抓取类实例。 2. 实现过程 2.1 步骤一:获取网页内容 使用C#自带的HttpClient类可以很方便地获取网页的原始内容。首先,我们需要先定义一个GetHtml方法…

    JavaScript 2023年6月10日
    00
  • 如何通过setTimeout理解JS运行机制详解

    接下来我将详细讲解如何通过setTimeout理解JS运行机制详解。 一、setTimeout概述 在深入了解JS运行机制之前我们需要先简单介绍一下setTimeout。 setTimeout指定要在多少毫秒后执行指定的代码,这是一个异步函数。使用setTimeout时你需要传递两个参数:要执行的函数以及延迟的时间,单位是毫秒。例如: setTimeout(…

    JavaScript 2023年6月10日
    00
  • 详解Html5 监听拦截Android返回键方法

    我会进行详细讲解。 HTML5 监听拦截 Android 返回键方法 在移动端开发中,Android 系统的返回键通常被用来做页面导航功能。但是,有时候我们需要在用户点击返回键时执行一些自定义的操作,比如:提示用户是否确认离开当前页面,或者执行一些其他的逻辑操作。那么如何监听和拦截 Android 返回键呢?本文将为你提供一些解决方案。 在 HTML5 中监…

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