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

【前端】【业务逻辑】【面试】JSONP处理跨域原理与封装

🧠 一、JSONP 是什么?

项目内容
📌 全称JSON with Padding
📍 用途跨域请求数据的一种方式,绕过同源策略
📦 本质通过 <script> 标签加载远程 JS 文件,这个文件执行一个回调函数并传入数据

🔍 二、JSONP 工作原理(层层递进)

  1. 定义全局回调函数

    function jsonpCallback(data) { console.log(data); }
    
  2. 创建 <script> 标签并设置 src

    script.src = 'http://example.com/api?callback=jsonpCallback';
    
  3. 服务器响应 JavaScript 代码

    jsonpCallback({ name: "Tom" });
    
  4. 浏览器执行返回的代码

    • 调用了你定义的 jsonpCallback 函数
    • 参数就是服务端返回的数据 ✅

❌ 三、常见错误

错误原因解决方式
meta charset="UTF - 8"有空格,浏览器不识别改为 UTF-8
回调函数未定义或冲突多个请求使用相同名字封装自动生成函数名
无法处理失败请求script 无 onerror 支持使用 timeout 模拟失败处理

🔧 四、封装 JSONP 工具函数(现代化 Promise 版)

✅ 功能要点:

  • 支持 URL 和参数拼接
  • 自动生成唯一回调名
  • 超时处理
  • 自动清理 script 和回调函数
  • 支持 Promise,可以用 .thenasync/await

✅ 封装代码:

function jsonp(url, params = {}, timeout = 5000) {return new Promise((resolve, reject) => {const callbackName = `jsonp_cb_${Date.now()}_${Math.random().toString().slice(2)}`;params.callback = callbackName;const queryString = Object.entries(params).map(([key, val]) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`).join('&');const script = document.createElement('script');script.src = `${url}?${queryString}`;script.async = true;window[callbackName] = (data) => {clearTimeout(timer);resolve(data);cleanup();};const timer = setTimeout(() => {reject(new Error('JSONP request timeout'));cleanup();}, timeout);function cleanup() {script.remove();delete window[callbackName];}document.body.appendChild(script);});
}

✅ 使用示例:

jsonp('http://example.com/api', { foo: 'bar' }).then(data => console.log('成功获取数据:', data)).catch(err => console.error('失败:', err));

🚀 五、JSONP 的优劣对比

优势局限
兼容老浏览器、实现跨域只能 GET 请求
使用简单安全性差(可能被注入恶意代码)
不依赖 XMLHttpRequest不支持 HTTP 状态码、错误处理有限

🧩 六、扩展方向(可选封装能力)

  • 支持取消请求(Abort)
  • 支持 callback 参数名自定义(如 cbfunc
  • 支持多个 JSONP 同时请求(自动管理全局空间)

相关文章:

【前端】【业务逻辑】【面试】JSONP处理跨域原理与封装

&#x1f9e0; 一、JSONP 是什么&#xff1f; 项目内容&#x1f4cc; 全称JSON with Padding&#x1f4cd; 用途跨域请求数据的一种方式&#xff0c;绕过同源策略&#x1f4e6; 本质通过 <script> 标签加载远程 JS 文件&#xff0c;这个文件执行一个回调函数并传入数据 …...

深入探索RAG:用LlamaIndex为大语言模型扩展知识,实现智能检索增强生成

大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT和Llama&#xff0c;在回答问题方面表现出色&#xff0c;但它们的知识仅限于训练时所获取的信息。它们无法访问私有数据&#xff0c;也无法在训练截止日期之后学习新知识。那么&#xff0c;核心问题就是……我们如…...

移远通信智能模组助力东成“无边界智能割草机器人“闪耀欧美市场

2025年4月21日&#xff0c;移远通信宣布&#xff0c;旗下SC206E-EM智能模组已成功应用于江苏东成电动工具有限公司旗下的DCK TERRAINA无边界智能割草机器人。 这款智能模组高度集成计算、通信、定位等多元能力&#xff0c;以小型化、低功耗、实时性强和低成本等综合优势&#…...

测试-时间规模化定律可以改进世界基础模型吗?

25年3月来自 UT Austin、UW Madison 和 Nvidia 的论文“Can Test-Time Scaling Improve World Foundation Model?”。 世界基础模型&#xff08;WFM&#xff09;通过根据当前的观察和输入预测未来状态来模拟物理世界&#xff0c;已成为许多物理智能&#xff08;PI&#xff09…...

VMwaer虚拟机复制粘贴、ROS系统安装

一、VMwaer虚拟机复制粘贴设置&#xff1a;设置完记得重启VMwaer 1.首先确定 虚拟机设置-->选项-->客户机隔离-->勾选 启用拖放 启用复制粘贴 2.如果还是不能粘贴 可能是 没有 VMware Tools 可参考 怎么在linux安装vmware tools-CSDN博客 设置完记得重启VMwaer。…...

安装 vmtools

第2章 安装 vmtools 1.安装 vmtools 的准备工作 1&#xff09;现在查看是否安装了 gcc ​ 查看是否安装gcc 打开终端 输入 gcc - v 安装 gcc 链接&#xff1a;https://blog.csdn.net/qq_45316173/article/details/122018354?ops_request_misc&request_id&biz_id10…...

HCIP(综合实验2)

1.实验拓补图 2.实验要求 1.根据提供材料划分VLAN以及IP地址&#xff0c;PC1/PC2属于生产一部员工划分VLAN10,PC3属于生产二部划分VLAN20 2.HJ-1HJ-2交换机需要配置链路聚合以保证业务数据访问的高带宽需求 3.VLAN的放通遵循最小VLAN透传原则 4.配置MSTP生成树解决二层环路问题…...

机器学习第一篇 线性回归

数据集&#xff1a;公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标&#xff1a;基于GDP值预测幸福指数。&#xff08;单特征预测&#xff09; 代码&#xff1a; 文件一&#xff1a;prepare_for_traning.py """用于科学计算的一个库…...

Spark-Streaming简介及核心编程

一、核心概念&#xff1a; 1.Spark-Streaming 是流式数据处理框架&#xff0c;基于 **DStream&#xff08;离散化流&#xff09;** 抽象&#xff0c;将实时数据划分为多个时间区间的 RDD 序列。 DStream 本质是RDD 序列&#xff0c;每个时间区间数据对应一个 RDD。 2.特点&a…...

优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论

优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论 目录 优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论信息论信息熵明确问题主题提供具体细节限定回答方向规范语言表达概率论最优化理论信息论 原理:信息论中的熵可以衡量信息的不确定性。…...

Sqlserver安全篇之_Sqlcmd命令使用windows域账号认证sqlserver遇到问题如何处理的案例

sqlcmd https://learn.microsoft.com/zh-cn/sql/tools/sqlcmd/sqlcmd-connect-database-engine?viewsql-server-ver16 sqlcmd -S指定的数据库连接字符串必须有对应的有效的SPN信息&#xff0c;否则会报错SSPI Provider: Server not found in Kerberos database. 正常连接 1、…...

基于华为云 ModelArts 的在线服务应用开发(Requests 模块)

基于华为云 ModelArts 的在线服务应用开发&#xff08;Requests 模块&#xff09; 一、本节目标 了解并掌握 Requests 模块的特点与用法学会通过 PythonRequests 访问华为云 ModelArts 在线推理服务熟悉 JSON 模块在 Python 中的数据序列化与反序列化掌握 Python 文件 I/O 的基…...

Graph Database Self-Managed Neo4j 知识图谱存储实践1:安装和基础知识学习

Neo4j 是一个原生图数据库&#xff0c;这意味着它在存储层实现了真正的图模型。它不是在其他技术之上使用“图抽象”&#xff0c;而是以您在白板上绘制想法的相同方式在Neo4j中存储数据。 自2007年以来&#xff0c;Neo4j已经发展成为一个丰富的工具、应用程序和库的生态系统。…...

【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1&#xff1a;配置虚拟环境案例2&#xff1a;智能代码补全案例3&#xff1a;调试配置 运行结果…...

vscode:Live Server Preview插件

这个插件不用另外打开浏览器&#xff1b;它是直接在Vscode里面预览html的&#xff0c;并且是自动实时更新的&#xff0c;不用不停地CtrlS保存查看 使用方法&#xff1a;F1 -> 弹出一个窗口输入live&#xff0c;选择即可。 运行结果如下&#xff1a;...

关于在Springboot中设置时间格式问题

目录 1-设置全局时间格式1.Date类型的时间2.JDK8时间3.使Date类和JDK8时间类统统格式化时间 2-关于DateTimeFormat注解 1-设置全局时间格式 1.Date类型的时间 对于老项目来说&#xff0c;springboot中许多类使用的是Date类型的时间&#xff0c;没有用到LocalDateTime等JDK8时…...

双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!

2025-04-21 语言更新 async 函数的调用处语法改为和 error 相同的 f!(..)&#xff0c;原语法 f!!(..) 将触发警告 运算符重载的语义从基于方法迁移到了基于 trait&#xff0c;以后重载运算符需要通过给 moonbitlang/core/builtin 中对应的 trait 添加 impl 的形式。各个运算符…...

AI 技术发展:从起源到未来的深度剖析

一、AI 的起源与早期发展​ 人工智能&#xff08;AI&#xff09;作为计算机科学的重要分支&#xff0c;其诞生可以追溯到 20 世纪中叶。1943 年&#xff0c;艾伦・图灵提出图灵机的概念&#xff0c;为计算机科学和 AI 理论奠定了基础。1950 年&#xff0c;图灵又提出著名的图灵…...

【前端】【业务逻辑】 数据大屏自适应方案汇总

前端数据大屏自适应设计方案全解析 在前端数据大屏的开发中&#xff0c;自适应设计是关键环节&#xff0c;它能确保大屏在不同设备和屏幕尺寸上都能呈现出良好的视觉效果和交互体验。除了常见的 transform: scale、rem/vw、Flex/Grid 等方案外&#xff0c;还有其他有效的方法可…...

Java基础复习(JavaSE进阶)第六章 IO流体系

6-1 File类 01 122、File、IO流概述 02 123、File类&#xff1a;对象的创建 03 124、File类&#xff1a;判断、判断信息相关的方法 04 125、File类&#xff1a;创建、删除文件的方法 05 126、File类&#xff1a;遍历文件夹的方法 6-2 前置知识 01 127、前置知识&#xff1a;方…...

kvm下的ceph主机启动io请求统计

背景 假如一个主机存储在ceph里面&#xff0c;我们想统计下一次启动过程中的io读取的情况&#xff0c;那么可以通过下面的方法来统计 启动时间也可以通过在宿主机里面去查看&#xff0c;通过日志这边要方便一点&#xff0c;无需登录到虚拟机内部 日志开启 [global] fsid 406…...

go-Casbin使用

本次测试代码是基于单租户的RBAC鉴权 依赖 github.com/casbin/casbin/v2 github.com/casbin/gorm-adapter/v2文件存储规则文件 model.pml [request_definition] r sub, obj, act[policy_definition] p sub, obj, act[role_definition] g _, _ # 用户,角色[polic…...

基于YOLOv11的106种手语识别分析系统

基于YOLOv11的手语识别分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】多平台适配优化&#xff0c;支持Windows、macOS和Linux系统&#xff0c;确保中文字体正常渲染 【四】识别的类别数量&#xff1a;106种&#xff0c;具体类…...

CentOS创建swap内存

服务器版本为CentOS7 一、检查现有 swap 空间 sudo swapon --show如果系统中没有 swap 空间或者现有的 swap 空间不足&#xff0c;可以继续后续步骤来创建 swap 空间。 二、创建 swap 文件&#xff08;推荐 2GB 作为示例&#xff09; sudo dd if/dev/zero of/swapfile bs1M …...

OpenHarmony OS 5.0与Android 13显示框架对比

1. 架构概述 1.1 OpenHarmony OS 5.0架构 OpenHarmony OS 5.0采用分层架构设计&#xff0c;图形显示系统从底层到顶层包括&#xff1a; 应用层&#xff1a;ArkUI应用和第三方应用框架层&#xff1a;ArkUI框架、窗口管理API系统服务层&#xff1a;图形合成服务、窗口管理服务…...

详解Node.js中的setImmediate()函数

setImmediate() 是 Node.js 提供的一个定时器函数&#xff0c;用于在 事件循环的 “Check” 阶段 执行回调函数。它与 setTimeout() 相似&#xff0c;但两者有着显著的区别&#xff0c;主要体现在回调函数的执行时机上。 什么是事件循环&#xff08;Event Loop&#xff09; 在…...

使用C#写的HTTPS简易服务器

由于监控网络之用&#xff0c;需要写一个https服务器。 由于用到https&#xff0c;因此还需一个域名证书&#xff0c;可以免费申请&#xff0c;也可以用一个现有的。 接下来还需在Windows上安装证书&#xff0c;注册证书。 安装证书 找到证书&#xff0c;点击&#xff0c;一路…...

C# 事件知识文档

C# 事件知识文档 概述 在 C# 中,事件(Event) 是一种特殊的机制,它基于委托实现,用于支持发布-订阅模式。事件允许对象在发生特定操作时通知其他对象,而无需直接引用这些对象。这种机制非常适合于实现诸如用户界面交互、状态变化通知等场景。 核心概念 发布者(Publishe…...

C++进阶--二叉搜索树

文章目录 C进阶--二叉搜索树概念算法复杂度模拟实现结构定义插入查找删除剩余的次要接口中序遍历&#xff1a; 构造&#xff0c;析构&#xff0c;拷贝构造&#xff0c;赋值重载 结语 很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路…...

互联网大厂Java面试:从基础到进阶的技术点探讨

场景&#xff1a;赵大宝的面试旅程 在互联网大厂的面试现场&#xff0c;严肃的面试官李老师正在准备对求职者赵大宝进行一场Java技术栈的深度考核。赵大宝是一位以幽默著称的程序员&#xff0c;面试官希望通过这次面试能全面了解他的技术能力。 第一轮提问 李老师&#xff1…...

【MCP Node.js SDK 全栈进阶指南】中级篇(1):MCP动态服务器高级应用

前言 在初级篇中,我们已经掌握了MCP TypeScript-SDK的基础知识,包括开发环境搭建、基础服务器开发、资源开发、工具开发、提示模板开发以及传输层配置等核心内容。随着我们对MCP的理解不断深入,是时候进入更高级的应用场景了。 MCP的一个强大特性是其动态性,能够在运行时…...

LM35 温度传感器介绍

【本文基于Arduino项目】 1. LM35 温度传感器简介 LM35 是一款 精密模拟温度传感器&#xff0c;由德州仪器&#xff08;TI&#xff09;推出&#xff0c;具有线性输出、无需校准、低功耗等特点&#xff0c;广泛应用于环境监测、工业控制等领域。 主要特性 参数规格测量范围-…...

【网络应用程序设计】实验一:本地机上的聊天室

个人博客&#xff1a;https://alive0103.github.io/ 代码在GitHub&#xff1a;https://github.com/Alive0103/XDU-CS-lab 能点个Star就更好了&#xff0c;欢迎来逛逛哇~❣ 主播写的刚够满足基本功能&#xff0c;多有不足&#xff0c;仅供参考&#xff0c;还请提PR指正&#xff…...

Cursor 设置规则

文章目录 1、一个可以参考的网站-各种语言都有2、正向设置规则通过 符号还可以引用子规则 3、逆向设置规则 1、一个可以参考的网站-各种语言都有 https://cursor.directory/rules 2、正向设置规则 注意&#xff0c;最开始规则设置已经作废&#xff08;下图下面的红框&#…...

人工智能-模型评价与优化(过拟合与欠拟合,数据分离与混淆矩阵,模型优化,实战)

欠拟合与过拟合 模型不合适&#xff0c;导致其无法与数据实现有效预测 欠拟合可以通过观察训练数据及时发现&#xff0c;通过优化模型结果解决 过拟合的原因&#xff1a; 1、模型结构过于复杂&#xff08;维度太高&#xff09; 2、使用了过多属性&#xff0c;模型训练时包含了…...

Python爬虫从入门到实战详细版教程

Python爬虫从入门到实战详细版教程 文章目录 Python爬虫从入门到实战详细版教程书籍大纲与内容概览第一部分:爬虫基础与核心技术1. 第1章:[爬虫概述](https://blog.csdn.net/qq_37360300/article/details/147431708?spm=1001.2014.3001.5501)2. 第2章:HTTP协议与Requests库…...

Java多线程编程初阶指南

目录 一.线程基础概念 线程是什么&#xff1f; 线程与进程对比 为啥要有线程 二.线程实现方式 继承Thread类 实现Runnable接口 常规实现方式 匿名内部类写法 Lambda表达式写法&#xff08;Java8&#xff09; 对比总结 三.Thread 类及常见方法 核心功能 核心构造方…...

Qt信号槽连接的三种方法对比

信号槽连接方法对比 1. 直接连接2. 集中管理3.函数指针初始化列表后期需要disconnect 对比 1. 直接连接 connect(codeWindow, &CodeEditorWindow::SetBaseLineSignal, monitoringWindow, &MonitoringWindow::SetBaseLineSlot),connect(&ButtonTree::Instance(), &a…...

健康生活新指南

在 “朋克养生” 与 “躺平焦虑” 并存的时代&#xff0c;真正的健康生活无需刻意 “内卷”。这几个简单又实用的养生妙招&#xff0c;能让你在忙碌日常中悄悄升级健康状态&#xff0c;轻松拥抱活力人生。​ 一、饮食&#xff1a;吃对食物&#xff0c;给身体 “加 Buff”​ 别…...

IF=24.5 靶向MMP9治疗协同提高抗PD1疗效

Targeted MMP9 therapy synergistically improves anti-PD1 efficacy CTNNB1GOF&#xff08;The gain of function (GOF) CTNNB1 mutations&#xff0c;功能获得型CTNNB1突变&#xff09;在肝细胞癌&#xff08;HCC&#xff09;中&#xff0c;已被证明与免疫排斥相关&#xff0…...

基于SpringBoot的中华诗词文化分享平台-项目分享

基于SpringBoot的中华诗词文化分享平台-项目分享 项目介绍项目摘要管理员功能图会员功能图系统功能图项目预览会员主页面诗词页面发布问题回复评论 最后 项目介绍 使用者&#xff1a;管理员、会员 开发技术&#xff1a;MySQLJavaSpringBootVue 项目摘要 本文旨在设计与实现一…...

SQLiteDatabase 增删改查(CRUD)详细操作

文章目录 1. 初始化数据库2. 插入数据 (Create)方法一&#xff1a;使用 ContentValues insert()方法二&#xff1a;直接执行SQL 3. 查询数据 (Read)方法一&#xff1a;使用 query() 方法方法二&#xff1a;使用 rawQuery() 执行原始SQL 4. 更新数据 (Update)方法一&#xff1a…...

从 0 到 1 打通 AI 工作流:Dify+Zapier 实现工具自动化调用实战

一、引言&#xff1a;当 AI 遇到工具孤岛 在企业数字化转型的浪潮中&#xff0c;AI 工具的应用早已从单一的对话交互进阶到复杂的业务流程自动化。但开发者常常面临这样的困境&#xff1a;本地开发的 MCP 工具&#xff08;如 ERP 数据清洗脚本、CRM 工单系统 API&#xff09;如…...

第四届商师校赛 web 1

RceMe ezGame 伪装 Ping Are you from SQNU? Look for the homepage Through 根据题目慢慢试 File_download Post上传得到下载文件 反编译一下 /* * Decompiled with CFR 0.152. * * Could not load the following classes: * javax.servlet.http.HttpServlet */ …...

SSH 互信被破坏能导致 RAC 异常关闭吗

一、 SSH 互信和 RAC 的关系 1、SSH 互信对 RAC 的作用 Oracle 11g R2 在安装 Grid Infrastructure 的时候&#xff0c;能够通过安装程序配置节 点间的 SSH 用户等效性&#xff0c;之所以要在安装之前配置 SSH 用户等效性&#xff0c;是为了能 够在安装前使用 C…...

工程投标k值分析系统(需求和功能说明)

1 需求总括 2 企业管理模块: 新增、删除、修改企业/部门 <...

Qt-托盘的实现

文章目录 托盘的功能QSystemTrayIcon 类QSystemTrayIcon类的常用函数代码实现 托盘的功能 GUI 程序&#xff0c;如果想要实现当最小化时&#xff0c;程序从任务栏消失&#xff0c;在系统托盘显示一个图标&#xff0c;表示此程序&#xff0c;并能在托盘内通过双击或者菜单使程序…...

【人脸识别】百度人脸识别H5方案对接

经调研&#xff0c;百度的人脸识别使用场景比较广泛且准确率较高&#xff0c;项目上有用到&#xff0c;这里做一下记录&#xff0c;整体对接没有难度&#xff0c;按照文档操作就行。 一、准备工作 1、需要注册百度云开放平台&#xff08;企业资质&#xff09;注册指南 2、创…...

用Qt和deepseek创建自己的问答系统

如果你不想花钱调用deepseek&#xff0c;试试下面的方法。 1: 访问 OpenRouter&#xff1a; https://openrouter.ai 2: 搜索 DeepSeek-R1 (free) 要使用这个免费模型&#xff0c;你需要&#xff1a; &#xff08;1&#xff09;注册 OpenRouter 账户并获取 API 密钥 访问 …...

飞搭系列 | 组件增加标记,提升用户体验

前言 Preface 飞搭低代码平台&#xff08;FeiDa&#xff0c;以下简称“飞搭”&#xff09;&#xff0c;为企业提供在线化、灵活的业务应用构建工具&#xff0c;支持高低代码融合&#xff0c;助力企业低门槛、高效率和低成本地快速应对市场变化&#xff0c;加速复杂业务场景落地…...