跨域问题解决方案的弃子——JSONP

news/2025/11/16 15:29:28/文章来源:https://www.cnblogs.com/haoxiugong/p/19228261

今天一位学弟“哭着”来找我,说他面试美团(实习岗)的时候,被问到了跨域问题的解决方案,回答的并不好。我还正想着,这么常见的问题回答不出来,这不就是基础不过关。但谁知道,面试官让他封装 JSONP 来实现跨域!怪我当时还告诉他们这种方案现在很少用,看一眼八股了解即可,现在可谓是啪啪打脸!

既然都问到了这个问题,那这篇文章就来详细讲讲跨域解决方案的弃子——JSONP!

  1. 为什么 JSONP 可以跨域?

之前的文章《跨域问题解决方案汇总》中详细阐述了跨域问题的由来和其他解决方案,这里就不再赘述了。

JSONP 可以实现跨域主要是利用了 <script src="https://api.example.com/data?callback=cb"> 脚本被浏览器加载,不受 SOP 限制(script、img、link 等资源请求是允许跨域的)。服务端返回 cb({...}) 回调函数,浏览器执行这段 JS,从而把数据传回页面。也就是说,JSONP 不是“绕过”安全策略,而是利用浏览器允许跨域 加载并执行脚本 的特性把数据“嵌回”到当前页执行。

  1. JSONP 存在的安全隐患

  • 任意脚本执行​:服务端返回的内容会作为脚本执行,若服务器被劫持或返回恶意代码,会导致 XSS。如果不验证 callback 参数,攻击者可以传入 callback=alert(1);evil 等恶意字符串导致执行。
  • 只能使用 GET 请求,存在 CSRF 风险​。
  • 无响应体读取控制​:无法控制响应头,自带所有风险。

至于什么是 XSS 和 CSRF 攻击,我们下篇文章再细嗦~

  1. 回到面试题——自己实现 JSONP

现在初入行的很多同学可能都没有自己实现过 JSONP,甚至因为考察较少,都没有听过 JSONP 。下面我将带着大家一步一步分析一下 JSONP 应该如何解决跨域。

我们需要考虑一下常见的网络请求,再结合 JSONP 实现:

  • 客户端:
    • callback 回调函数名
    • 支持 Promise(成功/失败/超时)
    • 动态插入 <script>,设置 onerror、超时处理、清理 DOM 与全局回调
  • 服务端:
    • 只允许可信 callback 名(白名单校验)
    • 返回 application/javascript,并输出 callback(data)

完整示例

客户端,我们封装一个 jsonp 函数作为统一调用。

/*** jsonp(url, opts) -> { promise, cancel }** opts:*  - param: cb作为查询参数名称 (默认: 'callback')*  - timeout: ms (默认: 10000)*  - prefix: 参数名的前缀-保证唯一性(默认: '__jp')*  - name: 可选,显式的 callback 名称** 返回:*  {*    promise: Promise<any>,*    cancel: () => void*  }** Promise 成功:resolve(data)* Promise 失败:reject(Error)*/
function jsonp(url, opts = {}) {const {param = 'callback',timeout = 10000,prefix = '__jp',name = null} = opts;return new Promise((resolve, reject) => {const callbackName = name || `${prefix}_${Date.now()}}`;const script = document.createElement('script');// 插入 callback 参数到 urlscript.src = `${url}${encodeURIComponent(param)}=${encodeURIComponent(callbackName)}`;script.async = true;let timer = null;// 成功回调:全局函数window[callbackName] = (data) => {cleanup();resolve(data);};// 处理错误与超时script.onerror = () => {cleanup();reject(new Error('JSONP script error'));};// 超时timer = setTimeout(() => {cleanup();reject(new Error('JSONP timeout'));}, timeout);// 清除掉 script 节点function cleanup() {if (script.parentNode) script.parentNode.removeChild(script);if (timer) {clearTimeout(timer);timer = null;}try {// 删除全局回调(避免泄露)delete window[callbackName];} catch (e) {window[callbackName] = undefined;}}// 插入到 document.head(或 body)(document.head || document.body).appendChild(script);});
}

客户端使用示例:

jsonp('https://api.example.com/get-article?id=1111').then(data => {console.log('jsonp data', data);}).catch(err => {console.error('jsonp error', err);});

服务端示例(Node.js + Express)

// server.js (Express)
const express = require('express');
const app = express();app.get('/api/jsonp/article', (req, res) => {const callback = req.query.callback;if (!callback) {res.status(400).type('text/plain').send('Invalid callback');return;}// 例如查询 DB 获得数据const data = {id: 111,title: '跨域解决方案的弃子——JSONP',author: 'Heo',content: '...'};// Content-Type 应设置为 application/javascriptres.type('application/javascript');res.send(`${callback}(data);`);
});// 启动
app.listen(3000, () => console.log('JSONP server on 3000'));

这样看来,其实并不难,只是同学们可能对于 jsonp 的接触都仅限于八股,还是就是面试时候的紧张,导致自己想不到这一系列的封装过程,最终被问到实现细节只能发呆,白白错过了 offer。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月智能床垫品牌TOP5推荐:服务器系统软件办公集成优化

一、2025年11月智能床垫品牌TOP5全景速览 1、澳洲施华白兰SWAN BEDDING 推荐指数:★★★★★ 口碑评分:9.9分 联系方式:4009936992 基础档案:源自1938年澳大利亚,全球护脊睡眠标杆品牌,依托百年工艺积淀与智能科…

CPU,GPU,DSP,FPGA,ASIC

💡 处理器类型概览名称 全称 核心特性 典型应用CPU 中央处理器 (Central Processing Unit) 通用串行计算,高灵活性,擅长复杂逻辑和控制流。 操作系统、日常软件、数据库。GPU 图形处理器 (Graphics Processing Uni…

智能床垫品牌全面选品指南:2025年11月最新TOP5榜单深度解析

** 一、2025年11月智能床垫品牌TOP5全景速览 1、澳洲施华白兰SWAN BEDDING 推荐指数:★★★★★ 口碑评分:9.9分 联系方式:4009936992 基础档案:源自1938年澳大利亚,作为全球护脊睡眠标杆品牌,拥有近百年工艺积淀…

DeepCFD+:一种工业级 CFD 代理模型训练框架【深度学习+流体力学】 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于Qt实现的窗口半透明流动背景

背景基于c++ & Qt实现的半透明渐变色窗口背景先看效果 (gif录制掉帧,请自行编译源码查看,效果比gif流畅)完整源码 GradientWidget.h #ifndef GRADIENTWIDGET_H #define GRADIENTWIDGET_H#include <QWidget&…

2025河南郑州锅炉设备/改造/安装/维修最新TOP5推荐:质造升级驱动产业新发展,河南中原地区优选

随着工业智能化转型加速,锅炉设备作为能源转化核心装备,其技术创新与安全效能成为企业选型的关键指标。本榜单基于资质认证、技术实力、服务体系三大维度,结合河南省特种设备检测研究院2024年度数据及行业用户调研反…

2025年11月冷媒剂厂家推荐榜:五家主流品牌综合对比与评价

进入2025年冬季,工业制冷、冷链物流、新能源电池热管理、数据中心温控等场景对冷媒剂的采购需求集中释放。用户普遍面临“低温不凝固、金属不腐蚀、能耗不飙升”的三重痛点,同时需要兼顾《危险化学品目录》最新调整、…

2025年11月防冻液厂家推荐榜:权威评测五强对比一览

进入供暖季前,工业循环冷却系统、空气能热泵、数据中心温控、冷链物流及新能源汽车热管理场景都会集中检查或更换防冻液。用户通常面临“冰点是否够低、金属缓蚀是否可靠、环保认证是否齐全、批量供货是否稳定”四大痛…

2025年11月防冻液厂家对比榜:五强性能数据与资质验证全记录

入冬在即,北方工业循环冷却系统、空气能热泵、数据中心温控管路陆续进入低温运行期,防冻液一旦选型失误,轻则机组停机,重则换热器冻裂、停产检修。过去两周,我接到最多的咨询是:“市面上防冻液厂家宣传相似,到底…

steam营销分析

观点来自:https://www.youtube.com/watch?v=uPOSZ_jhCaw&t=645s一.参加游戏节,需要订阅chirs的频道游戏节,新品节,会带来大量的流量由一些第三方公司举办,比如 方块游戏(皖新文化科技有限公司) 举办过,古…

2025年11月冷媒剂厂家评测榜:从资质到应用全场景解析

把冷媒剂选错一次,代价可能是整套制冷系统停机、货物变质、甚至安全事故。11月北方已进入供暖与冷链高负荷期,南方食品、医药、数据中心项目也在冲刺年底交付,用户此刻找厂家,最在意的是“现货快不快、资质全不全、…

心情助手3.07正式版,吃喝镇

心情助手3.07正式版,吃喝镇心情助手3.07正式版,吃喝镇下载地址: 心情助手3.07正式版.exe: https://url24.ctfile.com/f/17568224-971274511-54c9f2?p=8187 (访问密码: 8187)

在ec2上部署Qwen2.5omini和Qwen3omini模型

参考资料https://github.com/QwenLM/Qwen3-Omnihttps://qwen.ai/blog?id=65f766fc2dcba7905c1cb69cc4cab90e94126bf4&from=research.latest-advancements-list模型测评,https://www.bilibili.com/video/BV16SJyz…

分布式计算通信原语的抽象模型

学习深度神经网络并行策略时,常常混淆各种通信原语 Reduce/Scatter/Gather ... 本文尝试给出一种统一的抽象模型,将各类原语看作模型下一种个例。尝试简单调研并行计算理论,暂时没有找到完全一致对应的理论术语,故…

【shell】每日shell练习:安全日志入侵检测/专业的系统配置文件合规检查

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年第39周数字取证与事件响应技术动态

本周技术动态涵盖Salesloft-Drift入侵事件分析、SaaS供应链安全、恶意软件检测技术、数字取证新方法、威胁狩猎实践、漏洞利用分析等网络安全前沿技术内容,为安全专业人员提供全面技术参考。赞助内容 Salesloft-Drift…

第三次算法作业

动态规划法求解步骤​ (1)状态定义​:设 dp[i][j] 表示从第 i 行第 j 列元素出发,到达三角形底部的最大路径和。该定义精准捕捉了子问题的核心:每个位置的最优解仅依赖其下方的子问题结果。​ (2)递归方程式推导…

milvus: 搜索collection

一,代码:from flask import Blueprint,jsonify,render_template,requestfrom app import milvus_client from pymilvus import FieldSchema, DataType, CollectionSchema, Collection, connections from helpers.uti…

2025/11/16

2025/11/16学习算法

实用指南:《vector.pdf 深度解读:vector 核心接口、扩容机制与迭代器失效解决方案》

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …