首页 > 其他分享 >记录--求你了,别再说不会JSONP了

记录--求你了,别再说不会JSONP了

时间:2023-11-25 18:04:43浏览次数:30  
标签:const 跨域 记录 -- callback JSON JSONP 数据

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

JSONP是一种很远古用来解决跨域问题的技术,当然现在实际工作当中很少用到该技术了,但是很多同学在找工作面试过程中还是经常被问到,本文将带您深入了解JSONP的工作原理、使用场景及安全注意事项,让您轻松掌握JSONP。

JSONP是什么?

JSONP,全称JSON with Padding,是一项用于在不同域之间进行数据交互的技术。这项技术的核心思想是通过在页面上动态创建<script>标签,从另一个域加载包含JSON数据的外部脚本文件,然后将数据包裹在一个函数调用中返回给客户端。JSONP不仅简单而且强大,尤其在处理跨域数据请求时表现出色。

JSONP的工作原理

JSONP的工作流程如下:

  1. 客户端请求数据:首先,客户端会创建一个<script>标签,向包含JSON数据的远程服务器发出请求。这个请求通常包括一个名为callback的参数,用来指定在数据加载完毕后应该调用的JavaScript函数的名称。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSONP Example</title>
</head>
<body>
    <h1>JSONP Example</h1>
    <div id="result"></div>

    <script>
        // 定义JSONP回调函数
        function callback(data) {
            const resultDiv = document.getElementById('result');
            resultDiv.innerHTML = `Name: ${data.name}, Age: ${data.age}`;
        }

        // 创建JSONP请求
        const script = document.createElement('script');
        script.src = 'http://localhost:3000/data?callback=callback';
        document.body.appendChild(script);
    </script>
</body>
</html>
  1. 服务器响应:服务器收到请求后,将JSON数据包装在指定的回调函数中,并将其返回给客户端。响应的内容类似于:
const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

// 定义一个简单的JSON数据
const jsonData = {
  name: 'John',
  age: 30,
};

// 添加路由处理JSONP请求
router.get('/data', (ctx) => {
  const callback = ctx.query.callback;
  if (callback) {
    ctx.body = `${callback}(${JSON.stringify(jsonData)})`;
  } else {
    ctx.body = jsonData;
  }
});

// 将路由注册到Koa应用程序
app.use(router.routes()).use(router.allowedMethods());

// 启动Koa应用程序
const port = 3000;
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});
  1. 客户端处理数据:在客户端的页面中,我们必须事先定义好名为callback的函数,以便在响应被加载和执行时被调用。这个函数会接收JSON数据,供我们在页面中使用。

JSONP使用场景

跨域请求:JSONP主要用于解决跨域请求问题,尤其适用于无法通过CORS或代理等方式实现跨域的情况。 数据共享:在多个域名之间共享数据,可以利用JSONP实现跨域数据共享。 第三方数据获取:当需要从第三方网站获取数据时,可以使用JSONP技术。

使用JSONP注意事项

JSONP的简单性和广泛的浏览器支持使其成为跨域数据交互的强大工具。然而,我们也必须谨慎使用它,因为它存在一些安全考虑,我们分析下它的优缺点:

优点

  • 简单易用:JSONP非常容易实现和使用,无需复杂的配置。
  • 跨浏览器支持:几乎所有现代浏览器都支持JSONP。
  • 绕过同源策略:JSONP帮助我们绕过了同源策略的限制,轻松获取跨域数据。

安全考虑

  • XSS风险:JSONP未经过滤的数据可能会引起XSS攻击,因此需要对返回的数据进行过滤和验证。
  • CSRF攻击:使用JSONP时要注意防范CSRF攻击,可以通过添加随机数等方式增强安全性。
  • 仅支持GET请求:JSONP只支持GET请求,不适用于POST等其他HTTP方法。
  • 难以处理HTTP错误:JSONP难以有效处理HTTP错误,在请求失败时的异常处理比较困难。

随着技术的发展,JSONP已不再是首选跨域解决方案,但了解它的工作原理仍然有助于我们更深入地理解跨域数据交互的基本原理。在实际项目中,根据具体需求和安全考虑,建议优先选择CORS或代理服务器方式处理跨域问题。

本文转载于:

https://juejin.cn/post/7280435879548715067

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:const,跨域,记录,--,callback,JSON,JSONP,数据
From: https://www.cnblogs.com/smileZAZ/p/17855808.html

相关文章

  • 2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连, 孩
    2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连,孩子不能选相邻的格子,不能回头选,不能选超过一圈,但是孩子可以决定从任何位置开始选,也可以什么都不选。返回孩子能获得的最大分值。1<=n<=10^6,0<=arr[i]<=10^6。来自华为od。来自左程......
  • 【Windows】ARP断网攻击及防御
    title:ARP断网攻击及防御date:2022-10-0216:06:44tags:-windowscategories:-windows攻击PC1的IP地址10.9.136.222PC2的IP地址10.9.136.55在局域网里通信需要有IP地址和MAC地址两台电脑PC1和PC2要想相互通信,PC1在连接PC2的时候,PC1会先查看自己的ARP缓存表(命......
  • list集合的线程安全问题分析
    一、ArrayList先说结论,ArrayList是线程不安全的。至于为什么需要去了解它的实现原理,来看下它的源码。首先ArrayList是基于数据实现的,分析它的线程安全问题需要看下add方法publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Clone......
  • Linux常用命令的使用
        ......
  • 【Windows】DHCP部署与安全
    目录DHCP原理DHCP续约部署DHCP服务器删除DHCP服务wireshark抓取DHCP获取地址的四个步骤DHCP攻击与防御DHCP地址池耗尽攻击作用DynamicHostConfigureProtocol)自动分配IP地址相关概念地址池/作用域:(IP、子网掩码、网关、DNS、租期),DHCP协议端口是UDP67/68DHCP原理也成为DHCP......
  • 迭代器手写实现
    迭代器实现首先,实现接口Iterable其次,重写iterate方法,该方法返回类型又是一个迭代器,所有直接new。新new的迭代器采用匿名内部类,其中有两个方法:hasnext和next。这里因为需要迭代的对象是数组,通过索引即可获取数组每个元素。最后测试,使用foreach,其内部就是一个迭代器,会自动访问......
  • 【Windows】rdp、ftp协议的密码爆破
    目录密码爆破工具hydra九头蛇爆破远程桌面爆破ftp服务器密码wireshark抓包远程桌面rdp协议3389文件传输FTP协议2021攻击方:Kali测试方:Win7两台都要在同一网段密码爆破工具hydra九头蛇hydra(九头蛇)是著名黑客组织thc的一款开源的暴力破解密码工具,功能非常......
  • 函数式编程注意点
    函数式编程&lambda表达式今天在回顾学习java动态数组的基本操作时,学到:如果测试者要拿到方法内属性时,可以用函数式编程获取。函数式编程关注:返回值和参数个数。Consumer类返回类型void,参数只有一个,调用其accept方法用来操作。{{uploading-image-867431.png(uploading...)}}......
  • linux 中du命令指定以不同的单位显示文件的大小
     001、(base)[root@pc1test]#ls(base)[root@pc1test]#ddif=/dev/zeroof=a.txtcount=30bs=1M##生成一个测试文件30+0recordsin30+0recordsout31457280bytes(31MB)copied,0.0231627s,1.4GB/s(base)[root@pc1test]#ll-h......
  • 11.24-task3数据类型
    数据类型与操作基本类型整型int浮点数float布尔值bool(tureorfalse)类型Typetype的use:类型的类型就是类型。。。还有一些更多类型。。。常用内置常数python中是内置了一些常量的-常用内置运算符andornot类似于c语言的&&||!=运算顺序为not>and>......