当前位置: 首页 > news >正文

JSONP跨域原理全解析

JSONP(JSON with Padding)是一种绕过浏览器同源策略限制、实现跨域数据请求的“hack”式方案。其核心原理和流程如下:

  1. 同源策略限制
    浏览器为了安全,只允许页面从与当前页面相同协议、域名、端口的服务器加载数据。而 <script><img><link> 等标签对跨域不受同源策略限制——只要目标资源返回有效内容,浏览器就会加载并执行。

  2. 利用 <script> 标签跨域
    JSONP 利用该特性:前端通过动态创建一个 <script> 标签,设置其 src 属性指向目标跨域接口,并带上一个回调函数名参数,比如:

    <script>function handle(data) {console.log('服务器返回的数据:', data);}var script = document.createElement('script');script.src = 'https://api.example.com/data?callback=handle';document.head.appendChild(script);
    </script>
    
  3. 服务器端“打包”返回
    服务器接收到请求后,不是直接返回纯 JSON,而是把 JSON 数据“包裹”(padding)在指定的回调函数调用里,例如:

    handle({"name": "Alice","age": 30
    });
    

    浏览器加载这个脚本时,就会立即执行 handle(...),把数据当作参数传入页面上事先定义好的回调函数。

  4. 流程图示

    1. 页面定义全局回调函数 handle
    2. 页面动态插入 <script src="...callback=handle">
    3. 浏览器向跨域服务器发送 GET 请求。
    4. 服务器将 JSON 数据封装成 handle(JSON) 格式的脚本返回。
    5. 浏览器下载并执行该脚本,触发全局回调函数,拿到数据。
  5. 优缺点

    • 优点
      • 简单,无需 CORS 支持即可跨域请求 GET 接口。
    • 缺点
      • 仅支持 GET 请求,不支持 POST、PUT 等。
      • 安全性较差,容易受到 XSS 攻击(调用任意脚本)。
      • 回调地狱:多个并发请求时需要管理不同回调名。
  6. 现代替代
    随着 CORS(跨域资源共享)和 fetch/XMLHttpRequest 支持跨域请求,JSONP 已被逐步淘汰,仅在极少数不支持 CORS 的老旧环境下使用。


示例代码

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>JSONP 示例</title><script>// 全局回调函数function jsonpCallback(data) {document.getElementById('output').textContent ='Hello, ' + data.name + ',你 ' + data.age + ' 岁了!';}// 动态加载 JSONP 脚本function loadData() {const script = document.createElement('script');script.src = 'https://api.example.com/user?callback=jsonpCallback';document.head.appendChild(script);}</script>
</head>
<body><button onclick="loadData()">获取用户信息</button><div id="output"></div>
</body>
</html>

上述例子中,当点击按钮时,会向 https://api.example.com/user?callback=jsonpCallback 发起跨域请求,服务器返回:

jsonpCallback({ "name": "Bob", "age": 25 });

浏览器执行该脚本,直接调用页面上的 jsonpCallback,完成数据读取和展示。

相关文章:

  • vue2使用el-tree实现两棵树间节点的拖拽复制
  • 计算机网络实验课(三)——直接使用数据构造以太网帧,打包并发送|使用SharpPcap库函数构造以太网帧,并发送出去
  • 【Webtrees 手册】第 8章 - 网站管理员指南
  • 在 Unity 中,Start 方法直接设置 RectTransform 的位置,时出现问题,与预计位置不匹配。
  • LightGBM的python实现及参数优化
  • 从十进制到二进制:深入理解定点数与浮点数表示
  • Python学习(2) ----- Python的类型
  • 多模态大语言模型arxiv论文略读(九十五)
  • Python正则表达式:30秒精通文本处理
  • Java中数组(一维/二维)与字符串操作(String/StringBuilder/StringBuffer)详解
  • mysql中的索引怎么用?
  • 高压单端探头,如何实现大比例的衰减?
  • 在thinkphp5.0中。单表使用 model clone 时就会有问题。 需要使用 alias(), 否则会报错。
  • 网络协议:[0-RTT 认证 ]
  • 一起学数据结构和算法(二)| 数组(线性结构)
  • VMware-MySQL主从
  • 板凳-------Mysql cookbook学习 (七)
  • 2025上半年软考高级系统架构设计师经验分享
  • Elasticsearch索引机制与Lucene段合并策略深度解析
  • 【QT】在QT6中读取文件的方法
  • 0基础怎么做网站模版/seo线上培训班
  • 宁波seo外包推广/seo排名优化工具
  • wordpress 嵌入html/信息流优化师简历怎么写
  • 哪些网站是wordpress/页面关键词优化
  • 新野企业网站建设/搜索关键词排名
  • 深圳建设网站公/解析域名网站