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

跨域解决方案之JSONP

目录

 

一、JSONP 核心原理

二、JSONP 实现步骤

(一)客户端代码

(二)服务器端代码(ASP.NET实现)

1. ASP.NET Web Forms 实现

2. ASP.NET Core 实现

三、JSONP 优缺点

(一)优点

(二)缺点

四、JSONP 适用场景


 

在 Web 开发领域,跨域问题始终是开发者需要攻克的难关。浏览器的同源策略严格限制了不同源(协议、域名、端口任意一项不同)之间的资源访问,导致 AJAX 请求无法直接获取跨域数据。JSONP(JSON with Padding)作为早期流行的跨域解决方案,利用<script>标签的特性巧妙绕过这一限制。虽然如今 CORS 已成为主流,但 JSONP 的原理与应用仍值得深入了解。

一、JSONP 核心原理

JSONP 的核心在于利用<script>标签不受同源策略限制的特性。在 HTML 中,<script>标签可以加载任意域名的 JavaScript 文件,浏览器会自动执行其中的代码。JSONP 将原本的 JSON 数据包裹在一个函数调用中,形成可执行的 JavaScript 代码,从而实现跨域数据传输。

具体流程如下:

  • 客户端定义回调函数:在页面中创建一个全局函数,用于接收和处理服务器返回的数据。
  • 动态发起请求:通过创建<script>标签,并将请求 URL 设置为src属性,其中包含指定的回调函数名参数。
  • 服务器响应包装:服务器接收到请求后,提取回调函数名,将数据以该函数调用的形式返回。
  • 浏览器执行代码:浏览器加载并执行<script>标签中的代码,自动调用回调函数,将数据传递给客户端。

二、JSONP 实现步骤

(一)客户端代码

以下是通过原生 JavaScript 实现的 JSONP 请求示例,包含按钮点击触发请求的逻辑:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JSONP Example</title>
</head>
<body><button id="fetchDataBtn">获取数据</button><div id="result"></div><script>function handleData(data) {console.log('Received data:', data);document.getElementById('result').innerHTML = JSON.stringify(data);}const fetchDataBtn = document.getElementById('fetchDataBtn');fetchDataBtn.addEventListener('click', function () {// 移除之前的script标签const existingScripts = document.querySelectorAll('script[src^="https://api.example.com/data?callback=handleData"]');existingScripts.forEach(script => script.remove());const script = document.createElement('script');const url = 'https://api.example.com/data?callback=handleData';script.src = url;document.body.appendChild(script);});</script>
</body>
</html>

在上述代码中:

  • 定义handleData回调函数,用于处理服务器返回的数据,并更新页面内容。
  • 为按钮添加点击事件监听器,每次点击时先移除已存在的用于该 JSONP 请求的<script>标签,避免标签冗余,再动态创建新的<script>标签发起请求。

(二)服务器端代码(ASP.NET实现)

1. ASP.NET Web Forms 实现

在ASP.NET Web Forms 项目中,可在WebForm1.aspx.cs文件中添加如下代码:

using System;
using System.Web;public partial class WebForm1 : System.Web.UI.Page
{protected void Page_Load(object sender, EventArgs e){string callback = Request.QueryString["callback"];if (!string.IsNullOrEmpty(callback)){var data = new { message = "This is data from ASP.NET server", code = 200 };string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(data);string jsonpResponse = $"{callback}({jsonData})";Response.ContentType = "application/javascript";Response.Write(jsonpResponse);Response.End();}}
}

上述代码中,首先获取 URL 中的callback参数,然后将数据序列化为 JSON 字符串,再将其包装在回调函数中,最后设置响应头并返回结果。

2. ASP.NET Core 实现

在ASP.NET Core 项目中,需先安装Newtonsoft.Json包,然后在Controllers文件夹下创建JsonpController.cs文件,代码如下:

using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;namespace JsonpDemo.Controllers
{[Route("api/[controller]")][ApiController]public class JsonpController : ControllerBase{[HttpGet]public IActionResult GetData(){string callback = Request.Query["callback"];if (string.IsNullOrEmpty(callback)){return BadRequest("callback parameter is required");}var data = new { message = "This is data from ASP.NET Core server", code = 200 };string jsonData = JsonConvert.SerializeObject(data);string jsonpResponse = $"{callback}({jsonData})";return Content(jsonpResponse, "application/javascript");}}
}

在ASP.NET Core 的实现里,通过控制器接收请求,获取callback参数,包装数据后以指定的application/javascript类型返回 JSONP 响应。

三、JSONP 优缺点

(一)优点

  • 兼容性好:几乎支持所有浏览器,包括老旧版本,适用于对浏览器兼容性要求高的项目。
  • 实现简单:无需复杂的服务器配置和中间件,客户端和服务器端代码逻辑清晰,易于上手。

(二)缺点

  • 安全性低:由于允许加载任意来源的 JavaScript 代码,容易遭受跨站脚本攻击(XSS)。若服务器返回的内容被篡改,可能导致用户数据泄露。
  • 仅支持 GET 请求:受<script>标签请求方式限制,无法满足 POST、PUT 等其他请求类型的需求,不适用于数据提交场景。
  • 错误处理困难:缺乏像 AJAX 那样完善的错误处理机制,请求失败时难以准确捕获和处理错误信息,不利于调试。

四、JSONP 适用场景

尽管 JSONP 存在诸多局限性,但在某些场景下仍有其价值:

  • 老旧项目兼容:对于无法大规模重构的历史项目,为实现跨域功能且保证浏览器兼容性,JSONP 可作为过渡方案。
  • 简单数据查询:仅需从服务器获取数据,且对安全性要求不高的场景,如公开 API 的数据查询。

JSONP 作为早期的跨域解决方案,以独特的方式在 Web 开发历史中留下了印记。虽然随着技术发展,CORS 凭借更高的安全性和更全面的功能逐渐占据主导地位,但 JSONP 的原理和应用依然是开发者理解跨域技术演进的重要一环。

 

相关文章:

跨域解决方案之JSONP

目录 一、JSONP 核心原理 二、JSONP 实现步骤 &#xff08;一&#xff09;客户端代码 &#xff08;二&#xff09;服务器端代码&#xff08;ASP.NET实现&#xff09; 1. ASP.NET Web Forms 实现 2. ASP.NET Core 实现 三、JSONP 优缺点 &#xff08;一&#xff09;优点 …...

【AI测试革命】第七期:AI性能测试的深度实践——从智能建模到自动化调优的全链路升级

在微服务架构与高并发场景普及的当下&#xff0c;性能测试作为保障系统稳定性和用户体验的核心环节&#xff0c;正面临负载模型构建复杂、脚本维护成本高、瓶颈定位效率低等挑战。Copilot凭借代码生成、数据分析和智能决策能力&#xff0c;为性能测试全流程注入新动能&#xff…...

Thinkphp6使用token+Validate验证防止表单重复提交

htm页面加 <input type"hidden" name"__token__" value"{:token()}" /> Validate 官方文档 ThinkPHP官方手册...

AppAgentx 开源AI手机操控使用分享

项目地址: https://appagentx.github.io/?utm_sourceai-bot.cn GitHub仓库: https://github.com/Westlake-AGI-Lab/AppAgentX/tree/main arXiv技术论文:https://arxiv.org/pdf/2503.02268 AppAgentx是什么: AppAgentX 是西湖大学推出的一种自我进化式 GUI 代理框架。它通过…...

Axure设计之带分页的穿梭框原型

穿梭框&#xff08;Transfer&#xff09;是一种常见且实用的交互组件&#xff0c;广泛应用于需要批量选择或分配数据的场景。 一、应用场景 其典型应用场景包括&#xff1a; 权限管理系统&#xff1a;批量分配用户角色或系统权限数据筛选工具&#xff1a;在大数据集中选择特…...

嵌入式硬件篇---陀螺仪|PID

文章目录 前言1. 硬件准备主控芯片陀螺仪模块电机驱动电源其他2. 硬件连接3. 软件实现步骤(1) MPU6050初始化与数据读取(2) 姿态解算(互补滤波或DMP)(3) PID控制器设计(4) 麦克纳姆轮协同控制4. 主程序逻辑5. 关键优化与调试技巧(1) 传感器校准(2) PID参数整定先调P再调D最后…...

电机控制储备知识学习(五) 三项直流无刷电机(BLDC)学习(四)

目录 电机控制储备知识学习&#xff08;五&#xff09;一、三项直流无刷电机(BLDC)学习&#xff08;四&#xff09;1&#xff09;软件方法控制电机转速2&#xff09;PWM概念和PWM的产生3&#xff09;转子位置检测和霍尔传感器的工作原理分析4&#xff09;霍尔传感器安装角度和电…...

Java—— 网络爬虫

案例要求 https://hanyu.baidu.com/shici/detail?pid0b2f26d4c0ddb3ee693fdb1137ee1b0d&fromkg0 http://www.haoming8.cn/baobao/10881.html http://www.haoming8.cn/baobao/7641.html上面三个网址分别表示百家姓&#xff0c;男生名字&#xff0c;女生名字&#xff0c;如…...

Baklib内容中台的主要构成是什么?

Baklib内容中台核心架构 Baklib作为一站式知识管理平台的核心载体&#xff0c;其架构设计围绕智能搜索引擎优化技术与多终端适配响应系统展开。通过模块化内容组件的灵活配置&#xff0c;企业可快速搭建知识库、FAQ页面及帮助中心等标准化场景&#xff0c;同时借助可视化数据看…...

深度解析 Java 中介者模式:重构复杂交互场景的优雅方案

一、中介者模式的核心思想与设计哲学 在软件开发的历史长河中&#xff0c;对象间的交互管理一直是架构设计的核心难题。当多个对象形成复杂的网状交互时&#xff0c;系统会陷入 "牵一发而动全身" 的困境。中介者模式&#xff08;Mediator Pattern&#xff09;作为行…...

家用和类似用途电器的安全 第1部分:通用要求 与2005版差异(7)

文未有本标准免费下载链接。 ——增加了“对峰值电压大于15kV的&#xff0c;其放电电能应不超过350mJ”的要求&#xff08;见8.1.4&#xff09; 1. GB/T4706.1-2024&#xff1a; 8.1.4 如果易触及部件为下述情况,则不认为其是带电的。 ——该部件由安全特低电压供电,且: 对…...

HTTP Digest 认证:原理剖析与服务端实现详解

HTTP Digest 认证&#xff1a;原理剖析与服务端实现详解 HTTP 协议中的 Digest 认证&#xff08;摘要认证&#xff09;是一种比 Basic 认证更安全的身份验证机制&#xff0c;其核心设计是避免密码明文传输&#xff0c;并通过动态随机数&#xff08;Nonce&#xff09;防范重放攻…...

untiy实现汽车漫游

实现效果 汽车漫游 1.创建汽车模型 导入汽车模型(FBX格式或其他3D格式),确保模型包含车轮、车身等部件。 为汽车添加碰撞体(如 Box Collider 或 Mesh Collider),避免穿透场景物体。 添加 Rigidbody 组件,启用重力并调整质量(Mass)以模拟物理效果。 2.编写汽车控制脚本…...

PID项目---硬件设计

该项目是立创训练营项目&#xff0c;这些是我个人学习的记录&#xff0c;记得比较潦草 1.硬件-电路原理电赛-TI-基于MSPM0的简易PID项目_哔哩哔哩_bilibili 这个地方接地是静电的考量 这个保护二极管是为了在电源接反的时候保护电脑等设备 大电容的作用&#xff1a;当电机工作…...

Pluto实验报告——基于FM的音频信号传输并解调恢复

目录 一、实验目的 ................................ ................................ ................................ .................. 3 二、实验内容 ................................ ................................ ................................ ......…...

【Redis】AOF日志

目录 1、背景2、工作原理3、核心配置参数4、优缺点5、AOF文件内容 1、背景 AOF&#xff08;Append Only File&#xff09;是redis提供的持久化机制之一&#xff0c;它通过记录所有修改数据库状态的写命令来实现数据库持久化。与RDB&#xff08;快照&#xff09;方式不同&#…...

Leetcode 2792. 计算足够大的节点数

1.题目基本信息 1.1.题目描述 给定一棵二叉树的根节点 root 和一个整数 k 。如果一个节点满足以下条件&#xff0c;则称其为 足够大 &#xff1a; 它的子树中 至少 有 k 个节点。 它的值 大于 其子树中 至少 k 个节点的值。返回足够大的节点数。 如果 u v 或者 v 是 u 的…...

《关于浔川社团退出DevPress社区及内容撤回的声明》

《关于浔川社团退出DevPress社区及内容撤回的声明》 尊敬的DevPress社区及读者&#xff1a; 经浔川社团内部决议&#xff0c;我社决定自**2025年5月26日**起正式退出DevPress社区&#xff0c;并撤回所有由我社成员在该平台发布的原创文章。相关事项声明如下&#xff1a; …...

Windows逆向工程提升之IMAGE_RESOURCE_DIRECTORY

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 资源目录概述 什么是资源目录&#xff1f; 资源目录的作用 资源目录的位置 资源目录核心结构 IMAGE_RESOURCE_DIRECTORY IMAGE_RESOURCE_DIRECTORY_ENTRY IMAGE_RESOURCE_DATA_EN…...

使用ps为图片添加水印

打开图片 找到文字工具 输入想要添加的水印 使用移动工具移动到合适的位置 选中文字图层 设置不透明度 快捷键ctrlt可以旋转 另存为png格式图片...

x64_ubuntu22.04.5安装:cuda driver + cuda toolkit

引言 本文操作均已实践验证&#xff0c;安装流程来自nvidia官方文档&#xff0c;验证平台显卡&#xff1a;RTX4070。 验证日期&#xff1a;2025.5.24. 1.安装cuda driver 1.1.安装方式有2种&#xff0c;这里选择方式1&#xff1a; 从apt安装最省事&#x1f496;&#xff0c…...

开盘啦 APP 抓包 逆向分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 抓包 这是一个记录贴。 这个APP是数…...

vs2022 Qt Visual Studio Tools插件设置

安装之后&#xff0c;需要指定QT中msvc编译器的位置&#xff0c;点击下图Location右边的按钮即可 选择msvc2022_64\bin目录下的 qmake.exe 另一个问题,双击UI文件不能打开设计界面 设置打开方式 选择msvc2022_64\bin目录下的designer.exe 确定即可 然后设置为默认值即可 确定…...

Python包__init__.py标识文件解析

在 Python 中&#xff0c;__init__.py 文件是包&#xff08;Package&#xff09;的核心标识文件&#xff0c;它的存在使一个目录被 Python 解释器识别为「包」。这个文件有以下核心作用&#xff1a; 核心作用 标识包的存在 任何包含 __init__.py 的目录都会被 Python 视为一个包…...

【MySQL】第8节|Innodb底层原理与Mysql日志机制深入剖析(一)

MySQL 的 redo log&#xff08;重做日志&#xff09; redo log 是 MySQL 中 InnoDB 存储引擎实现事务持久性的关键机制&#xff0c;用于记录数据库数据的变更&#xff0c;确保事务提交后数据不丢失&#xff0c;即使发生宕机也能通过日志恢复数据。 核心作用 1. 实现事务的持…...

电商ERP管理系统,Java+Vue,含源码与文档,统筹订单、库存等,助力电商企业高效运营

前言&#xff1a; 在当今数字化飞速发展的电商时代&#xff0c;电商企业面临着日益激烈的市场竞争和复杂的业务运营环境。为了提升运营效率、降低成本、优化客户体验&#xff0c;一套高效、全面的电商ERP管理系统显得尤为重要。电商ERP管理系统整合了企业内部的各项业务流程&a…...

Spring Boot微服务架构(四):微服务的划分原则

微服务划分原则&#xff08;CRM系统案例说明&#xff09; 一、微服务划分的核心原则 单一职责原则&#xff08;SRP&#xff09; 每个微服务只负责一个明确的业务功能服务边界清晰&#xff0c;避免功能混杂便于独立开发、测试和部署 业务领域驱动设计&#xff08;DDD&#xff0…...

【打卡】树状数组的操作

#define MAXN 1000 int n; // 数组实际长度 int array[MAXN]; // 原始数组&#xff08;下标从0开始&#xff09; int tree[MAXN]; // 树状数组&#xff08;下标从1开始&#xff09; int p[MAXN]; // 前缀和数组&#xff08;下标从1…...

OpenLayers 加载动画控件

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图控件是一些用来与地图进行简单交互的工具&#xff0c;地图库预先封装好&#xff0c;可以供开发者直接使用。OpenLayers具有大部分常用的控件&#x…...

Oracle 基础知识作业的使用

对于DBA来说&#xff0c;数据库Job再熟悉不过了&#xff0c;因为经常要数据库定时的自动执行一些脚本&#xff0c;或做数据库备份&#xff0c;或做数据的提炼&#xff0c;或做数据库的性能优化&#xff0c;包括重建索引等等的工作。 Oracle 视图 User_Jobs 是Oracle数据库中的一…...