JSONP解决跨域数据访问问题

2023-10-31

介绍

JSONP (JSON with Padding)是JSON 的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。

还是那句话:JSONP虽然用不到,但是要了解,后续要用CORS

JSONP实现原理

由于浏览器同源策略的限制,网页中无法通过Ajax请求非同源的接口数据。但是<script>标签不受浏览器同源策略的影响,可以通过src属性,请求非同源的js 脚本。

因此,JSONP 的实现原理,就是通过<script>标签的src属性,请求跨域的数据接口,并通过函数调用的形式,接收跨域接口响应回来的数据。

剖析JSONP实现原理1

<script>
  function success(data) {
    console.log('拿到了Data数据:')
    console.log(data)
  }
</script>

<script>
  success({ name: 'zs', age: 20 })
</script>

可以看到虽然函数调用和声明不在同一个script标签中,但是可想而知是可以成功的

剖析JSONP实现原理2

注意:这里只是剖析简单的实现原理,具体script请求后端接口后那边如何处理就不是咱们要管的了

在这里因为getdata.js中并未写任何检测查询字符串信息所以我们?后面的一些参数并没有用,只是普通的调用整个js脚本
在这里插入图片描述
之后我们在浏览器就可以看到调用了abc函数
在这里插入图片描述

可以在下图看到我们并没有走Ajax请求,直接就是JS
在这里插入图片描述
因为请求的接口js并没有做任何判断因此会忽略查询字符串的参数,直接调用整个js脚本
在这里插入图片描述

Jquery中的JSONP

JQuery提供的$.ajax()函数,除了可以发起真正的ajax数据请求之外,还能够发起jsonp数据请求,例如:

$(function () {
  // 发起JSONP的请求
  $.ajax({
    url: 'http://ajax.frontend.itheima.net:3006/api/jsonp?name=zs&age=20',
    // 代表我们要发起JSONP的数据请求
    dataType: 'jsonp',
    jsonp: 'callback',
    jsonpCallback: 'abc',
    success: function (res) {
      console.log(res)
    }
  })
})

我们要想通过ajax发起jsonp数据请求就必须修改dataType

默认情况下,使用jQuery 发起JSONP请求,会自动携带一个callback=jQueryxxx 的参数,jQueryxxx是随机生成的一个回调函数名称。

自定义参数和回调函数名称

在使用jQuery 发起JSONP请求时,如果想要自定义JSONP 的参数以及回调函数名称,可以通过如下两个参数来指定:

// 发送到服务端的参数名称,默认值为callback
jsonp: 'callback',

// 自定义的回调函数名称,默认值为jQueryxxx格式
jsonpCallback: 'abc',

当然一般我们不会去修改这些属性,只做一个了解

跨域请求 --> dataType: “jsonp” 请求不支持同步操作。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。\

Jquery中JSONP的实现过程

jQuery 中的JSONP,也是通过<script>标签的src属性实现跨域数据访问的,只不过,jQuery 采用的是动态创建和移除<script>标签的方式,来发起JSONP数据请求。

  • 在发起JSONP请求的时候,动态向<head>中append一个<script>标签;
  • 在JSONP 请求成功以后,动态从<head>中移除刚才append进去的<script>标签;

END


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSONP解决跨域数据访问问题 的相关文章

随机推荐

  • ASP.NET MVC3 类面向切面AOP 的Filter操作

    在开发大项目的时候总会有相关的AOP面向切面编程的组件 而MVC 特指 Asp Net MVC 以下皆同 项目中不想让MVC开发人员去关心和写类似身份验证 日志 异常 行为截取等这部分重复的代码 那我们可以通过AOP截取实现 而在MVC项目
  • 生产者/消费者代码(使用notify和wait实现)

    package cn wzy Lock import java util Random public class ConsumerAndProducer static String food new String 5 static Stri
  • TypeScript入门二(类型)

    1 TypeScrip 的静态类型 TypeScript 的一个最主要特点就是可以定义静态类型 英文是 Static Typing 那到底是什么意思那 太复杂的概念性东西这里就不讲了 你可以简单的理解 静态类型 为 就是你一旦定义了 就不可
  • js 数据转换(保留两位小数,去除前面多余的0等)

    保留两位小数 不够的添0补齐 function changeTwoDecimal f x var f x parseFloat x if isNaN f x return 0 var f x Math round x 100 100 var
  • 为什么const 定义的对象和数组可以改变它的值呢

    碰到这个问题我第一反应是肯定不能改变 如果要改变值的话 用const定义干嘛 然后不信邪在浏览器控制台试试结果 卧槽 但是定义一个基本类型 确实改不了 那为什么const 定义的对象和数组可以改变它的值呢 我来为大家解释一下 都知道对象和数
  • Unity3D实战【七】Cinemachine & Post Processing 摄像机跟踪和后处理

    一 摄像机跟随 1 PackManger中安装Cinemachine 2 点击菜单栏的Cinemachine gt Create Virtual Camera 会代替原来的Main Camera 3 调整参数 Body Framing Tr
  • js中根据已知key得到某对象中相对应的value的方法

    给自己打个小广告 有开发APP 小程序 网站 后台系统需求 或者 想学习前端的可以私信我哈 var key accountBingFlag1 var value obj key var key accountBingFlag1 var va
  • 如何用git命令生成Patch和打Patch

    在程序员的日常开发与合作过程中 对于code的生成patch和打patch 应用patch 成为经常需要做的事情 什么是patch 简单来讲 patch中存储的是你对代码的修改 什么是生成patch 生成patch就是记录你对代码的修改并将
  • python-selenium-规避检测,无头浏览器

    1 无头浏览器 取消的浏览器的可视化界面 在一定程度上加了自动化速度 chrome options Options chrome options add argument headless chrome options add argume
  • Eclipse 解决JSON parse error: Invalid UTF-8 总结 完善

    今天在本地测试通过的代码 部署之Tomcat 服务器 前端同事给我反馈如下的错误信息 org springframework http converter HttpMessageNotReadableException message JS
  • 下载的python没有pip_python – 所有依赖项都不会通过“pip download”下载

    我正在尝试使用可以在没有互联网连接的计算机上重新安装的软件包来设置本地目录 但是我遇到了一些软件包的问题 我首先下载包 pip download r requirements txt d my packages no binary all
  • python_元组_1.07

    一 元组 1 定义 python的元组与列表类似 不同之处在于元组的元素一旦定义就不能修改 添加 删除 可以访问 元组使用小括号 列表使用方括号 元组创建很简单 只需要在括号中添加元素 并使用逗号隔开即可 course chinese ma
  • 微信小程序-消息提示框实例

    做Android的时候对toast是很熟悉的 微信小程序开发中toast也是重要的消息提示方式 提示框 wx showToast OBJECT 显示消息提示框 OBJECT参数说明 示例代码 wx showToast title 成功 ic
  • 第5讲:业务扩展模型图

    业务扩展模型图主要是将雨雾流程相关的重要人 事 物及这个业务流程所要达成的目标做一个链接 不过有关业务流程的内部细节 通常不会在这张图中介绍 一 元素 1 1 流程 Process 代表一连串有意义的工作流程 在一个 流程 中通常要达成一个
  • myeclipse出现Could not find the main class原因分析

    昨天晚上像往常一样打开myeclipse 随便运行一个类 run as java application 居然弹出Could not find the main class Program will exit 按照以往的经验 做如下检查 编
  • 【Unity】ShaderToys——将大神们写的shader搬到unity中来吧

    这篇文章翻译自国外的一篇文章 这里是原文链接 正在使用unity的你是否在shader toy上发现很多牛逼哄哄的shader却不知道如何使用 那么这篇文章就是帮助你来进行转换的 本文只是基础文章 那些对HLSL CG GLSL都很熟悉的大
  • 后台权限管理系统(2)——系统基础数据的展示

    目录 1 页面效果展示 2 具体实现 2 1 订单管理模块 2 1 1 订单展示页面 2 1 2 订单详情页面 1 页面效果展示 实现效果如下 订单管理页面 产品管理页面 2 具体实现 2 1 订单管理模块 2 1 1 订单展示页面 点击订
  • opencv imread图像读取不成功

    不论是imread读取相对路径还是绝对路径 如果imread读取不成功 显示Nnoe 很有可能是你的路径名字中含有中文 检查你的路径中是否含有中文 有的话将其改为英文 1 相对路径示例 import cv2 假如图像文件位于当前工作目录下的
  • 对 TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)函数在PWM应用中的理解

    注意 以下为本人理解 并非权威 仅做参考 虚心接受指正 首先看原函数如下 void TIM SetCompare1 TIM TypeDef TIMx uint16 t Compare1 Check the parameters assert
  • JSONP解决跨域数据访问问题

    介绍 JSONP JSON with Padding 是JSON 的一种 使用模式 可用于解决主流浏览器的跨域数据访问的问题 还是那句话 JSONP虽然用不到 但是要了解 后续要用CORS JSONP实现原理 由于浏览器同源策略的限制 网页