JS JSOP跨域请求实例详解

yizhihongxing

JS JSOP跨域请求实例详解

什么是跨域请求?

跨域请求是指在一个来源(即域名、端口、协议都相同)的网页中,不能发起对另一个来源的网页的请求。这是由浏览器的同源策略所限制的。

当在一个网页中通过 AJAX、Fetch、WebSocket 等方式向另一个域名(或主机名、端口号、协议)发起请求时,由于安全原因,浏览器会拦截这些请求,而这种被拒绝的请求就称为“跨域请求”。

为什么需要跨域请求?

在 Web 开发中,跨域请求是常见的需求。

例如,站点 A 的前端需要向站点 B 的服务端发起请求获取数据,但由于两个域名不同,因此不能直接发起请求,需要通过跨域方式来实现。此时,就需要使用跨域请求技术。

JSONP 是什么?

JSONP(JSON with Padding)是一种跨域请求方式,通过动态创建 <script> 标签,将返回的数据作为 JS 脚本执行,从而实现跨域请求。

JSONP 的核心原理在于:当前页面动态创建一个 <script> 标签,请求跨域服务器的数据,而接受到返回数据时,则是调用当前页面中预先定义好的函数,将返回数据作为参数传入,进而处理数据。

JSONP 的优点:

  • 不受同源策略的限制,实现跨域请求
  • 兼容性好,在老版本的浏览器、移动端等场景下都有良好的支持
  • 界面友好,用户体验佳

JSONP 的缺点:

  • 安全性问题,存在 XSS 攻击的风险
  • 只支持 GET 方式的请求

JSONP 的实现步骤

  1. 在 HTML 页面中创建一个 <script> 标签,指定请求的地址及需要回调的函数。

```html

```

getData 是服务端提供的接口 URL,callback 是指定需要回调的函数名,handleData 是在自己的 JS 中定义的函数名。

  1. 服务端需要读取 URL 中的 callback 参数,并将数据通过此函数返回。

    javascript
    function getData(req, res) {
    const responseData = { username: 'Alice', age: 18 };
    const callbackName = req.query.callback; // 获取回调函数名
    res.send(`${callbackName}(${JSON.stringify(responseData)})`);
    }

    此处以 Node.js 为例,使用 res.send 方法返回数据。

  2. 客户端实现回调函数。

    javascript
    function handleData(data) {
    console.log(data.username); // 输出 "Alice"
    console.log(data.age); // 输出 18
    }

示例一:使用 JSONP 跨域请求百度搜索结果

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>JSONP 示例</title>
</head>
<body>
  <script>
    function handleData(data) {
      const result = document.querySelector('#result');
      const links = data.g.map(d => `<li><a href="${d.u}">${d.k}</a></li>`).join('');
      result.innerHTML = `<ul>${links}</ul>`;
    }
  </script>
  <div>
    <input id="keyword" type="text" placeholder="请输入关键词">
    <button onclick="search()">搜索</button>
  </div>
  <div id="result"></div>
  <script>
    function search() {
      const keyword = document.querySelector('#keyword').value;
      const url = `https://www.baidu.com/su?wd=${keyword}&cb=handleData`;
      const script = document.createElement('script');
      script.src = url;
      document.body.appendChild(script);
    }
  </script>
</body>
</html>

示例二:使用 JSONP 跨域请求阿凡达数据接口

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>JSONP 示例</title>
</head>
<body>
  <div>
    <input id="keyword" type="text" placeholder="请输入角色名称">
    <button onclick="search()">搜索</button>
  </div>
  <div id="result"></div>
  <script>
    function handleData(data) {
      const result = document.querySelector('#result');
      const links = data.data.map(d => `<li>${d.name} / ${d.affiliation}</li>`).join('');
      result.innerHTML = `<ul>${links}</ul>`;
    }
  </script>
  <script>
    function search() {
      const keyword = document.querySelector('#keyword').value;
      const url = `https://jsonp.afeld.me/?url=https://www.avatarapi.com/api/v1/characters/search&name=${keyword}&access_token=demo`;
      const script = document.createElement('script');
      script.src = url;
      document.body.appendChild(script);
    }
  </script>
</body>
</html>

以上两个示例演示了使用 JSONP 跨域请求的实现方法。需要注意的是,JSONP 虽然能够实现跨域请求,但也存在一定的安全风险。在前端使用 JSONP 时,应注意数据的合法性和安全性,避免被攻击者利用漏洞进行 XSS 攻击。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS JSOP跨域请求实例详解 - Python技术站

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

相关文章

  • JS和jQuery使用submit方法无法提交表单的原因分析及解决办法

    让我详细讲解一下“JS和jQuery使用submit方法无法提交表单的原因分析及解决办法”的完整攻略。 1. 概述 在开发网页时,我们经常会使用JS和jQuery来操作DOM元素和处理表单数据。其中,提交表单是经常用到的操作,但是有时我们会遇到JS和jQuery使用submit方法无法提交表单的情况。这时,我们就需要对其原因进行分析,并采取相应的解决办法。 …

    JavaScript 2023年6月10日
    00
  • 浅析Bootstrap表格的使用

    浅析Bootstrap表格的使用 Bootstrap是一个流行的前端框架,提供了丰富的组件和样式。表格是一个必不可少的组件,本文将深入浅出地介绍Bootstrap表格的使用,包括如何创建基本表格、添加样式、排序、过滤和分页等。 创建基本表格 在Bootstrap中,我们可以使用<table>元素来创建表格。以下是一个最基本的表格结构: <t…

    JavaScript 2023年6月11日
    00
  • js实现页面多个日期时间倒计时效果

    JS实现页面多个日期时间倒计时效果的攻略如下: 1. 获取倒计时目标时间 首先,我们需要通过JS获取到倒计时的目标时间。目标时间可以通过后端接口获取,也可以通过前端手动指定。我们可以使用Date对象,把目标时间转化为时间戳,之后再与当前时间的时间戳作差,得到剩余时间。 // 获取目标时间 let targetTime = new Date(‘2022-01-…

    JavaScript 2023年5月27日
    00
  • js 判断各种数据类型的简单方法(推荐)

    当我们使用JavaScript编程时,经常需要知道变量的类型。下面是一些定义常见Javascript数据类型的方法。 确定变量的类型 在JavaScript中,有许多方法可以确定变量类型。下面是常用的几种方法: 1. typeof 操作符 typeof 操作符是一种在Javascript中常用的方法,它可以确定变量的数据类型。有时我们需要判断一个值是否是字符…

    JavaScript 2023年5月28日
    00
  • 一文搞懂JavaScript中的this绑定规则

    一文搞懂JavaScript中的this绑定规则 一、前言 在JavaScript中,this是一个非常重要的概念,它指向的是当前函数的执行环境,它的值取决于函数的调用方式。但是由于this的规则比较复杂,经常会引起开发者的困惑,因此我们有必要详细了解JavaScript中this的工作机制和绑定规则。 二、this的指向 在JavaScript中,this…

    JavaScript 2023年6月10日
    00
  • 详解mvc使用JsonResult返回Json数据

    下面是详解mvc使用JsonResult返回Json数据的攻略: 步骤一:编写代码 在MVC的控制器中定义一个方法,例如: public JsonResult GetStudent() { var student = new Student { Name = "小明", Age = 18, Gender = "Male&quot…

    JavaScript 2023年5月27日
    00
  • javascript获取dom的下一个节点方法

    当我们需要获取一个DOM元素的下一个兄弟节点时,有以下两个方法: 方法一:使用nextSibling属性 DOM节点对象拥有一个nextSibling属性,该属性用于获取当前节点的下一个兄弟节点。需要注意的是,这个属性获取到的兄弟节点可能是文本节点、注释节点等。 // 获取 id 为 "test" 的元素的下一个兄弟节点 var test…

    JavaScript 2023年6月10日
    00
  • JS课堂笔记(4.17-4.21)

    一、循环  1.在程序中,一组被重复执行的语句被称为循环体,能否继续重复执行,取决于循环的终止条件。由循环体及循环的终止条件组成的语句,被称为循环语句。 2.循环执行的过程是①第一次循环:第一次赋值,然后条件判断,执行循环体,最后执行累计。 ②非第一次循环:条件判断,执行循环体,最后执行累计。 3.continue,跳过本次进入下一次循环,从continue…

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