JSONP 的工作原理

本文介绍了JSONP的工作原理及其在跨域数据请求中的作用。详细解释了如何利用script标签的特性实现跨域通信,以及服务端如何响应客户端的请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7/80—
layout: JSONP 的工作原理
title: JSONP 的工作原理
date: 2017-11-15 21:06:47

tags:

JSONP 的工作原理

1. JSONP由来

根据浏览器同源策略,所谓同源就是协议、主机、端口号都相同时成为同源。a 域的js不能直接访问 b域名的信息,但是script 标签的src属性可以跨域引用文件,jsonp是请求之后后台包装好一段json,并且把数据放在一个callback函数,返回一个js文件,动态引入这个文件,下载完成js之后,会去调用这个callback,通过这样访问数据。

2. JSONP有什么用

由于同源从略的限制,XMLHttpRequest只允许请求前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后再服务端输出JSON数据并执行回调函数,从而解决跨域数据请求

3. 如何使用JSONP

  • HTML代码
    HTML代码
  • PHP代码
    PHP代码

4. JSONP原理

首先在客户端注册一个callback,然后把callback的名字传给服务器。此时,服务器先生成json数据,然后以javascript语法的方式,生成function,function名字就是传递上来I带参数jsonp。最后将json数据直接以入参的方式,放置function中,这样就生成js语法的文档,返回给客户端。客户端浏览器,解析script变迁,并执行返回javascript文档,此时数据作为参数,传入了客户端预先定义好的callback函数里。
简单的说,就是利用script标签没有跨域限制的“漏洞”来达到与第三方通讯的目的。

5. 备注

json 是一种数据格式
jsonp 是一种数据调用的方式,
联系 带callback的json就是jsonp
### JSONP工作原理 JSONP(JSON with Padding)是一种用于解决跨域数据请求的技术。它基于 `<script>` 标签的特性,能够加载来自不同域名下的 JavaScript 文件。 #### 跨域问题背景 浏览器出于安全考虑实施了同源策略(Same-Origin Policy),即只有协议、主机名和端口号完全相同的两个页面才能互相访问对方的资源。然而,在实际开发中,常常需要从不同的服务器获取数据。此时,`<script>` 标签提供了一种绕过此限制的方式,因为它可以加载任意来源的脚本文件[^1]。 #### 实现机制 当客户端发起一个 JSONP 请求时,实际上是在动态创建一个 `<script>` 元素并将其插入 DOM 中。这个 `<script>` 元素指向目标 URL,并附带了一个回调函数名称作为参数。服务端接收到该请求后返回一段可执行的 JavaScript 代码,这段代码调用了指定的回调函数并将所需的数据传递给它[^2]。 以下是具体的流程描述: 1. **定义全局回调方法** 客户端先定义好接收响应数据的方法。 ```javascript function handleResponse(data) { console.log('Received data:', data); } ``` 2. **构建 script 动态节点** 使用 JavaScript 创建一个新的 `<script>` 元素,并设置其 src 属性为目标地址加上附加查询字符串形式传入 callback 参数值。 ```javascript const script = document.createElement('script'); script.src = 'https://example.com/api?callback=handleResponse'; document.body.appendChild(script); ``` 3. **服务端处理逻辑** 当服务器接收到上述带有特定 `callback` 查询项的 GET 请求之后,应该按照约定好的格式组装结果——即将原始 JSON 数据包裹在一个由 client 提供的名字所表示的函数体内再发送回去。 ```javascript // Server-side response example (Node.js/Express) app.get('/api', (req, res) => { const jsonData = { key: 'value' }; const callbackName = req.query.callback; res.type('application/javascript'); res.send(`${callbackName}(${JSON.stringify(jsonData)})`); }); ``` 4. **最终效果展示** 浏览器下载完成后立即运行那段被注入进去的新 JS 片段;由于其中包含了对之前声明过的那个 handler 函数的实际调用操作,因此也就实现了异步取得远程 API 返回的信息的目的[^5]。 #### 缺点分析 尽管 JSONP 是一种简单有效的解决方案,但它也存在一些明显的缺点: - **仅限于GET方式**:因为它是通过添加外部 js 来完成整个交互过程的,所以无法像 AJAX 那样自由选择其他的 HTTP 方法比如 POST 或 DELETE 等; - **安全性隐患**:如果第三方站点不可信,则可能会带来潜在风险,例如恶意修改网页内容或者窃取敏感信息等问题发生概率增加[^4]。 ```python def jsonp_example(): """ A simple Python representation of how a server might respond to a JSONP request. This is purely illustrative and does not represent actual executable code within the context described above. """ import json def generate_jsonp_response(callback_name="jsonpCallback", data={"message": "Hello from JSONP!"}): return f"{callback_name}({json.dumps(data)})" print(generate_jsonp_response()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值