JS JSOP跨域请求实例详解

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日

相关文章

  • 浅析JavaScript 箭头函数 generator Date JSON

    浅析JavaScript箭头函数、generator、Date、JSON JavaScript是一门非常灵活的编程语言,拥有非常多的特性和语法糖。在本文中,我们会浅析JavaScript中箭头函数、generator、Date、JSON这四个常用特性。 JavaScript箭头函数 JavaScript箭头函数是ES6引入的一项语法糖,它可以简化函数的语法,…

    JavaScript 2023年5月27日
    00
  • JavaScript获取URL汇总

    我将为你详细讲解如何在JavaScript中获取URL。 一、获取当前页面URL 要获取当前页面的URL,在JavaScript中可以使用window.location.href属性。window.location对象包含很多元素,如协议(http、https等)、主机名、端口、路径和查询字符串等。使用window.location.href属性可以获取完整…

    JavaScript 2023年6月11日
    00
  • 不唐突的JavaScript的七条准则整理收集

    针对“不唐突的JavaScript的七条准则整理收集”的完整攻略,我将按照以下步骤进行讲解: 简介 准则一:使用模块化编程 准则二:避免使用全局变量 准则三:显式声明变量类型 准则四:封装重用的代码 准则五:使用 API 和库 准则六:舍弃 eval() 函数 准则七:使用立即执行函数表达式 示例说明 总结 1. 简介 该攻略旨在探讨如何写出不唐突的 Jav…

    JavaScript 2023年5月18日
    00
  • 简单实现JS对dom操作封装

    实现JS对DOM操作的封装一般有如下几个步骤: 1.定义一个构造函数,用于实例化一个操作DOM的对象 2.在该构造函数的原型上,定义一系列方法,用于对DOM进行操作。比如,增加、删除、修改元素的属性、样式等 3.封装一些通用的操作DOM的方法,比如获取元素、遍历元素、判断元素类型等,方便调用者使用 4.用新增的构造函数创建一个实例对象,调用封装好的方法操作D…

    JavaScript 2023年6月10日
    00
  • JavaScript将字符串转换为整数的方法

    JavaScript中将字符串转换成整数的方法有多种,以下是其中的四种方法。 1. parseFloat方法 parseFloat方法将字符串解析成浮点数,如果字符串开头部分可以解析成浮点数的话,就返回该浮点数,否则返回NaN。 let str = "1234.567"; let num = parseFloat(str); consol…

    JavaScript 2023年5月28日
    00
  • ES6基础语法之对象介绍

    ES6基础语法之对象介绍 在ES6中,新的语法规范,对象展开操作符、对象方法、计算属性名以及内置Object属性等,在对象的定义与操作中起到了很大的作用。 对象基础 在ES6中,我们可以通过对象字面量的方式来创建一个对象,如下所示: let obj = { name: ‘张三’, age: 18, sex: ‘男’ }; ES6还引入了一个新的关键字let来…

    JavaScript 2023年5月27日
    00
  • 突袭HTML5之Javascript API扩展3—本地存储全新体验

    突袭HTML5之Javascript API扩展3—本地存储全新体验 什么是本地存储 本地存储是 HTML5 新增的一个功能,可以让我们在客户端本地浏览器中存储数据,而无需借助服务器实现存储,该技术包含 localStorage 和 sessionStorage 两种技术。 localStorage 和 sessionStorage 的不同之处在于 loca…

    JavaScript 2023年6月11日
    00
  • 使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)

    下面是“使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)”的完整攻略: 简介 在处理汉语文本时,我们时常需要统计其中汉字的数量。本文将介绍如何使用js判断一个字符串中汉字的个数,实现代码也非常简单易懂。 实现方法 本文介绍的方法是基于js的正则表达式来实现的。具体来说,我们使用 \p{Script=Han} 属性匹配汉字字符,然后利用正则表达式的…

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