码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • jsonp是什么?原理是什么?


    【问】jsonp是什么?实现原理?

    【答】
    jsonp背景:
    jsonp出现的背景是由于浏览器对ajax同源策略限制(协议、域名、端口号必须相同),无法访问非同源数据,但script标签请求的资源,却无此限制。正是由于这个原因,可借助script实现跨域请求,这种请求数据的方案我们叫它jsonp。

    jsonp原理分析:

    1. 前端动态创建一个script标签,src指向请求地址并添加dataType=jsonp&callback=jp1(和后端约定好dataType=jsonp代表这是这是jsonp请求,这时给我返回的应该是一个方法调用,方法名从callback参数中取。本例中就应该返回jp1(555),比如555为后端要响应给前端的数据)
    2. 前端事先定义好,window.jp1 = function (res) {console.log(res)},此函数为前端拿到res结果后想要处理的逻辑。
    3. 该script组装完毕并发出请求后,后端返回’jp1(555)'并会被script自动执行。由于是script标签,它会把响应内容当作js来执行(就像scipit引入第三方js库时,它拿到返回后的字符串后会马上执行)

    【扩展1】jsonp实现示例?

    //1. jsonp工具实现示例
    function jsonp(option, cb){
    	// 示例参数
    	// option = {
        //     url: 'http://www.baidu.com/api',
    	// 	dataType: 'jsonp',
    	// 	param: {
    	// 		a: 1,
        //         callback: 'jp1'
    	// 	}
    	// },
    	// cb = function (res) {
    	// 	console.log('后端返回', res)
    	// }
    
         // 动态创建 script 标签
         var jpscript = document.createElement("script")
         // 约定callback的值作为返回调用的函数名
         jpscript.src="http://www.baidu.com/api?dataType=jsonp&callback=jp1&a=1" //根据option组装成该格式
         // 向页面添加 script 标签
         document.body.appendChild(oscript)
    
         // 实现定义好该函数,后端返回scrip请求后将触发该函数
         window['jp1']  = function (res){ //根据option命名回掉函数名称,函数体为参数cb
            console.log(res)
            //优化:可在这销毁掉刚才动态创建的script
        }
    }
    
    // 2. 前端调用示例
    jsonp(
        {
            url: 'http://www.baidu.com/api',
    		dataType: 'jsonp',
    		param: {
    			a: 1,
    		}
        }, 
        function (res){
    		console.log('后端返回了', res)
        }
    )
    
    // 3. 后端实现示例, nodejs
    const express = require('express');
    const app = express();
    app.get('/api', (req, res) => {
        // 1 判断如果是jsonp的话,应该返回一个函数调用
        if(req.dataType == 'jsonp'){
            // 此处为后端根据入参的处理逻辑,比如根据req.query.a=1响应的后端数据如下
            let data = {
                name: '张三',
                age: 22
            };
            // 拼接一个函数调用的字符串
            let Str = `${req.query.callback}(${JSON.stringify(data)})`;
            // 把拼接好的字符串交给script解析
            res.send(Str);
        }
        // 2 非jsonp请求...
    
    });
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    参考1: jsonp 原理详解及 jsonp-pro 源码解析
    参考2:Node.js 实现jsonp详解
    参考3:jsonp解决跨域请求—nodejs写后端

  • 相关阅读:
    2022年天猫淘特淘宝双11超级红包跨店满多少减多少活动时间是从什么时候开始的可以领取淘宝天猫淘特2022双十一超级红包优惠券返利及跨店满减优惠活动?
    java计算机毕业设计html5健身房信息管理系统源码+数据库+系统+lw文档
    cewl工具(URL字典生成器)
    二次开发入门须知
    springcloud之项目实战服务治理
    js中减少if-else的几个小技巧
    Spring Security 前后端分离(前端篇)
    linux离线源码安装Redis
    《痞子衡嵌入式半月刊》 第 62 期
    分布式事务Seata源码解析12:全局事务执行流程之全局事务回滚
  • 原文地址:https://blog.csdn.net/sujinchang939024/article/details/127447635
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号