如何使用 JSONP 实现跨域请求?

server/2025/1/21 6:52:33/
http://www.w3.org/2000/svg" style="display: none;">

以下是使用 JSONP 实现跨域请求的步骤:

实现步骤:

1. 客户端设置

在客户端,你需要创建一个 <script> 标签,并将其 src 属性设置为跨域请求的 URL,并添加一个 callback 参数。这个 callback 参数将包含一个函数名,服务器会将数据作为该函数的参数返回。

示例代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JSONP Example</title>
</head>
<body><script>// 定义回调函数,用于处理服务器返回的数据function handleData(data) {console.log("Received data:", data);}</script><!-- 使用 script 标签发起跨域请求,指定 callback 参数为 handleData --><script src="http://api.example.com/data?callback=handleData"></script>
</body>
</html>

解释:

  • 首先,我们定义了一个名为 handleData 的函数,该函数将在服务器返回数据时被调用。
  • 然后,我们使用 <script> 标签发起请求,src 属性指向跨域的 URL http://api.example.com/data,并添加 callback=handleData 参数。服务器将把数据包装在 handleData 函数的调用中返回。
2. 服务器端设置

服务器端需要解析请求中的 callback 参数,并将数据作为该函数的参数返回。

示例代码(以 Node.js 为例):

const http = require('http');http.createServer((req, res) => {// 解析请求 URL 中的 callback 参数const urlParts = req.url.split('?');let callback = '';if (urlParts.length > 1) {const params = urlParts[1].split('&');for (let param of params) {if (param.startsWith('callback=')) {callback = param.split('=')[1];break;}}}// 假设要返回的数据const data = { message: 'Hello from server!' };// 设置响应头为 JavaScript 类型res.writeHead(200, {'Content-Type': 'application/javascript'});// 将数据作为回调函数的参数返回res.end(`${callback}(${JSON.stringify(data)})`);
}).listen(3000);

解释:

  • 首先,我们通过解析请求的 URL 来获取 callback 参数。
  • 然后,我们创建一个要返回的数据对象 data
  • 接着,我们设置响应头为 application/javascript,因为我们要返回一段 JavaScript 代码。
  • 最后,我们将数据作为 callback 函数的参数,通过字符串拼接的方式返回,例如:handleData({ "message": "Hello from server!" })

注意事项:

  • 安全性问题:由于 JSONP 是通过 <script> 标签实现的,它可以执行任何 JavaScript 代码,所以你需要确保请求的来源是可信的,以避免安全风险。
  • 仅支持 GET 请求:JSONP 只能使用 GET 请求,因为 <script> 标签不支持其他请求方法。
  • 请求参数:如果需要发送更多的请求参数,可以在 URL 中添加更多的查询参数,例如 http://api.example.com/data?callback=handleData&param1=value1&param2=value2

总结:

使用 JSONP 实现跨域请求是一种比较简单的方法,主要通过客户端定义回调函数并在 <script> 标签中指定,服务器端将数据包装在该回调函数中返回。但由于其仅支持 GET 请求和存在安全隐患,在现代 Web 开发中,CORS 通常是更好的选择。在某些特殊场景下,如需要兼容旧的浏览器或系统时,JSONP 仍然是一个可用的跨域方案。


http://www.ppmy.cn/server/160105.html

相关文章

STM32补充——FLASH

目录 1.内部FLASH构成&#xff08;F1&#xff09; 2.FLASH读写过程&#xff08;F1&#xff09; 2.1内存的读取 2.2闪存的写入 2.3FLASH接口寄存器&#xff08;写入 & 擦除相关&#xff09; 3.FLASH相关HAL库函数简介&#xff08;F1/F4/F7/H7&#xff09; 4.编程实战 …

麦田物语学习笔记:创建TransitionManager控制人物场景切换

基本流程 制作场景之间的切换 1.代码思路 (1)为了实现不同场景切换,并且保持当前的persistentScene一直存在,则需要一个Manager去控制场景的加载和卸载,并且在加载每一个场景之后,都要将当前的场景Set Active Scene,保证其为激活的场景,在卸载的时候也可以方便调用当前激活的场…

excel实用工具

持续更新… 文章目录 1. 快捷键1.1 求和 2. 命令2.1 查找 vloopup 1. 快捷键 1.1 求和 windows: alt mac : command shift T 2. 命令 2.1 查找 vloopup vlookup 四个入参数 要查找的内容 &#xff08;A2 6xx1&#xff09;查找的备选集 &#xff08;C2:C19&#xff09;…

Perl语言的数据库编程

Perl语言的数据库编程 近年来&#xff0c;随着互联网和数据技术的发展&#xff0c;数据库编程变得越来越重要。在众多编程语言中&#xff0c;Perl因其强大的文本处理能力而受到许多开发者的青睐。虽然Perl在网页开发和系统管理中起着重要的作用&#xff0c;但在数据库编程方面…

Redis集群部署详解:主从复制、Sentinel哨兵模式与Cluster集群的工作原理与配置

集群部署形式 1、主从复制1.1 工作机制1.2 配置实现1.3 优缺点1.4 部署形式1.5 主从复制优化 2、Sentinel 哨兵模式2.1 工作机制2.2 配置实现2.3 优缺点2.4 哨兵机制选举流程2.5 脑裂问题解决方案 3、Redis Cluster3.1 工作机制3.2 配置实现3.3 优缺点3.4 故障转移3.5 哈希槽为…

中国石油大学(华东)自动评教工具(涵盖爬虫的基础知识,适合练手)

我开发了一个用于自动评教的工具&#xff0c;大家可以试着用用&#xff0c;下面是链接。 https://github.com/restrain11/auto_teachingEvaluate 可以点个星吗&#xff0c;感谢&#xff01;&#x1fae1; 以下是我在开发过程中学到的知识 以及 碰到的部分问题 目录 动态爬虫和静…

[系统安全] 六十一.恶意软件分析 (12)LLM赋能Lark工具提取XLM代码的抽象语法树(初探)

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

word转pdf

依赖 先安装好MAVEN https://blog.csdn.net/m0_62214280/article/details/140643392 链接&#xff1a;https://pan.baidu.com/s/1jISO-TPEyLgC8RTmMJGRQw 提取码&#xff1a;9ju8 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words…