首页 > 其他分享 >揭秘JSONP原理:跨域数据传输的魔法钥匙!

揭秘JSONP原理:跨域数据传输的魔法钥匙!

时间:2024-11-29 15:03:30浏览次数:4  
标签:const 跨域 代码 JavaScript JSONP 数据传输 回调 客户端

JSONP(JSON with Padding)是一种通过动态创建 <script> 标签来实现跨域请求的技术。它利用了浏览器允许从不同源加载 JavaScript 文件的特性,从而绕过同源策略的限制。

JSONP 原理

  1. 客户端发起请求:客户端创建一个 <script> 标签,并将其 src 属性设置为包含回调函数名的 URL。
  2. 服务器响应:服务器接收到请求后,生成一个包含回调函数调用和数据的 JavaScript 代码,并将其返回给客户端。
  3. 执行回调:浏览器加载并执行返回的 JavaScript 代码,从而触发客户端定义的回调函数,处理返回的数据。

示例代码

客户端代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSONP Example</title>
    <script type="text/javascript">
        // 定义回调函数
        function handleResponse(data) {
            console.log("Received data:", data);
        }

        // 动态创建 <script> 标签
        function makeJsonpRequest(url) {
            var script = document.createElement('script');
            script.src = url;
            document.body.appendChild(script);
        }

        // 发起 JSONP 请求
        window.onload = function() {
            var url = "http://example.com/api?callback=handleResponse";
            makeJsonpRequest(url);
        };
    </script>
</head>
<body>
</body>
</html>
服务器端代码(假设使用 Node.js 和 Express)
const express = require('express');
const app = express();
const port = 3000;

app.get('/api', (req, res) => {
    const callback = req.query.callback; // 获取回调函数名
    const data = { message: 'Hello, world!' }; // 要返回的数据
    const response = `${callback}(${JSON.stringify(data)})`; // 构造 JSONP 响应
    res.setHeader('Content-Type', 'application/javascript'); // 设置响应类型为 JavaScript
    res.send(response); // 发送响应
});

app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}`);
});

详解

  1. 客户端部分

    • handleResponse 是客户端定义的回调函数,用于处理服务器返回的数据。
    • makeJsonpRequest 函数动态创建一个 <script> 标签,并将其 src 属性设置为包含回调函数名的 URL。
    • 当页面加载时,window.onload 事件触发,调用 makeJsonpRequest 函数发起 JSONP 请求。
  2. 服务器部分

    • 使用 Express 框架创建一个简单的服务器。
    • 在 /api 路由中,获取查询参数中的回调函数名 callback
    • 构造一个包含回调函数调用和数据的字符串,并将其作为 JavaScript 代码返回。
    • 设置响应头 Content-Type 为 application/javascript,以确保浏览器将其作为 JavaScript 代码执行。

注意事项

  1. 安全性:由于 JSONP 是通过动态插入脚本的方式实现跨域请求,因此存在安全隐患。如果服务器返回的 JavaScript 代码被恶意篡改,可能会执行任意代码。因此,在使用 JSONP 时需要确保服务器端的代码安全。
  2. 现代替代方案:随着 CORS(跨域资源共享)的普及,JSONP 的使用逐渐减少。CORS 提供了一种更安全、更灵活的方式来实现跨域请求。建议在新项目中优先考虑使用 CORS。

标签:const,跨域,代码,JavaScript,JSONP,数据传输,回调,客户端
From: https://blog.csdn.net/Q2024107/article/details/144137401

相关文章

  • 无需配对数据的对比学习图像到图像转换,助力跨域物体检测 | BMVC'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:ImprovingObjectDetectionviaLocal-globalContrastiveLearning论文地址:https://arxiv.org/abs/2410.05058论文代码:https://local-global-detection.github.io/创新点提出了一种新颖的图像到图像转换方法,用于......
  • SMB(Server Message Block)协议 中,SMB 加密和 SMB 签名是确保数据传输安全性的重要手段;N
    Windows11企业版中,SMB(ServerMessageBlock)共享协议确实与安全认证相关,特别是在涉及到网络共享、文件共享和认证时。SMB协议本身提供了多种认证和加密方式,以确保数据传输的安全性。下面是有关SMB登录时证书认证和安全认证的详细信息:1. SMB协议的认证方式SMB协议在Window......
  • vue3+vite打包配置,并部署nginx,解决部署之后axios请求跨域
    配置base配置base避免打包部署到服务器上后可能会报404,无法正确的获取的资源。//vite.config.tsexportdefaultdefineConfig({ base:"./"})配置路径别名//vite.config.tsimport{defineConfig}from"vite";importvuefrom"@vitejs/plugin-vue";//配置组件路......
  • SpringCloud入门(十二)全局过滤器和跨域
    一、全局过滤器全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的,如果我们希望拦截请求,做自己的业务逻辑则没办法实现。而GlobalFilter的逻辑需要自己写代码实现。定义方式是实现Glob......
  • 使用CORS解决跨域问题
    如果发起请求所在主机(也称为域)和处理请求所在主机的协议、域名和端口号这三者中有任何一项不同,那么发出的请求就叫跨域请求。出于网络安全性方面的考虑,跨域请求会被限制,SpringBoot后端不能直接处理跨域请求,为了解决这一问题,可以在后端项目中引入CORS解决方案。在CORS(Cros......
  • Gateway过滤器执行顺序以及跨域问题
    执行顺序请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执......
  • Tuxera NTFS2023破解版mac苹果数据传输神器
    TuxeraNTFS:让Mac与Windows数据无界互通###神奇的跨平台桥梁......
  • 如何设置 CORS允许跨域
    设置CORS(跨源资源共享,Cross-OriginResourceSharing)允许跨域访问是Web开发中常见的需求之一。CORS是一种安全机制,由浏览器实施,用于限制一个源(协议+域名+端口)上的网页脚本与另一个源上的资源交互的能力。下面是如何在服务器端设置CORS以允许跨域访问的一些常见方法。1.Nod......
  • 从组会尴尬到学术突破:Transformer助力跨域推荐解析
    最近学习了Transformer模型,突然意识到我常阅读的一篇论文中也使用了Transformer。回想起上次开组会时,老师问我论文中的模型是什么,我当时没有答上来,现在才发现其实用的就是Transformer。这种学习过程让我深感,学得越多,知识之间的联系就会越清晰,许多概念最终都能融会贯通。这......
  • 常见问题解决 --- 如何解决CROS跨域问题
    问题原因:前后端不是一个服务导致的浏览器禁止访问的安全问题。比如前端部署在http://x.x.x.x:8888,后端部署在http://x.x.x.x:9999,由于端口不一致,浏览器安全起见不允许一个web页面有不同ip或端口的地址发送出流量。在开发者工具可以看出CROS错误。解决办法:关闭浏览器安全策......