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

高级java每日一道面试题-2024年8月12日-网络篇-说一下JSONP的实现原理?

如果有遗漏,评论区告诉我进行补充

面试官: 说一下JSONP的实现原理?

我回答:

一、JSONP概述

JSONP是一种非官方的跨域数据交换协议,它允许在网页中通过<script>标签的src属性从其他域名(网站)安全地获取数据。由于浏览器的同源策略限制,直接通过Ajax等方式跨域请求数据通常是不被允许的,而JSONP则巧妙地绕过了这一限制。

二、JSONP的实现原理

JSONP的实现原理主要基于以下几点:

  1. 利用<script>标签的跨域能力

    • 浏览器对于<script><img><iframe>等标签的src属性请求是允许跨域的。因此,JSONP通过动态创建一个<script>标签,并将其src属性设置为跨域URL,从而实现对跨域数据的请求。
  2. 动态生成JavaScript代码

    • 服务器端在接收到请求后,会根据请求中的参数(如callback参数)动态生成一段JavaScript代码。这段代码通常是一个函数调用表达式,其中包含了客户端需要的数据,并且以请求中指定的函数名作为函数调用的名称。
  3. 客户端定义回调函数

    • 在发送请求之前,客户端需要在全局作用域中定义一个回调函数。这个函数的名称需要与请求URL中的callback参数值相匹配。当<script>标签加载并执行服务器端返回的JavaScript代码时,就会调用这个回调函数,并将数据作为参数传递给该函数。
  4. 处理返回的数据

    • 回调函数被调用后,就可以根据需要对返回的数据进行处理和展示了。由于数据是以JSON格式传递的,因此在回调函数内部可以很方便地解析这些数据。

三、JSONP的优缺点

优点

  • 简单易用:JSONP的实现相对简单,只需要在客户端和服务器端进行一些简单的配置即可。
  • 兼容性好:由于JSONP依赖于<script>标签的跨域能力,因此它几乎在所有支持JavaScript的浏览器中都能正常工作。

缺点

  • 只支持GET请求:由于JSONP是通过<script>标签的src属性实现的,因此它只能发送GET请求,无法发送POST等其他类型的请求。
  • 存在安全风险:如果第三方服务器返回的JavaScript代码被恶意修改,那么可能会对客户端造成安全威胁。因此,在使用JSONP时,需要确保信任提供数据的服务器。

四、JSONP的示例

以下是一个简单的JSONP示例:

客户端代码

<!DOCTYPE html>
<html>
<head><title>JSONP Example</title><script type="text/javascript">function myCallback(data) {console.log(data.message); // 处理返回的数据}// 动态创建<script>标签并设置src属性var script = document.createElement('script');script.src = 'http://example.com/data?callback=myCallback';document.body.appendChild(script);</script>
</head>
<body><!-- 页面内容 -->
</body>
</html>

服务器端代码(假设使用Node.js):

const http = require('http');
const querystring = require('querystring');http.createServer((req, res) => {const params = querystring.parse(req.url.split('?')[1]);const callback = params.callback;const data = { message: 'Hello, JSONP!' };// 构造并返回JavaScript代码res.end(`${callback}(${JSON.stringify(data)})`);
}).listen(3000, () => {console.log('Server is running on port 3000');
});

在这个示例中,客户端通过<script>标签向服务器发送了一个JSONP请求,并指定了回调函数名为myCallback。服务器接收到请求后,解析出回调函数名,并将数据包装成该函数调用的形式返回给客户端。客户端在接收到这段JavaScript代码后执行它,从而调用了myCallback函数并处理了返回的数据。

JSONP的限制

尽管JSONP可以解决跨域问题,但它也有一些明显的限制:

  • 只能支持GET请求,不支持POST或其他HTTP方法。
  • 安全性较低,容易受到XSS攻击。
  • 依赖于全局函数,可能会导致命名冲突。

由于这些限制,现代Web开发中更多地使用CORS(Cross-Origin Resource Sharing)来实现跨域请求,它提供了更安全、更灵活的跨域通信方式。然而,在一些旧的或特定的环境中,JSONP仍然是一种有效的解决方案。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【区块链+金融服务】基于区块链的一站式绿色金融开放平台 | FISCO BCOS应用案例
  • docker 安装mino服务,启动报错: Fatal glibc error: CPU does not support x86-64-v2
  • ComfyUI工作流|给你的线稿换上任意颜色,这个就太秀了!
  • 2024海外电商数据分析之巴西篇
  • Java语言程序设计基础篇_编程练习题*16.16(使用ComboBox和ListView)
  • 网络编程day3
  • Java中金额转换处理(转大写,三位一逗)
  • 您知道有哪些主流的大模型LLM开源项目吗?
  • Marmir,一个超牛的Python库
  • 力扣题/图论/岛屿数量
  • 【大数据】智慧园区大数据云平台整体建设方案(Word原件)
  • 【Python学习-UI界面】PyQt5 小部件14-QDock 子窗口
  • Redis常见的数据类型和应用场景
  • 一、在cubemx上配置sd和fatfs示例演示
  • 聚观早报 | 一加13配置细节曝光;谷歌首推人工智能手机
  • css系列之关于字体的事
  • HTTP中的ETag在移动客户端的应用
  • React-flux杂记
  • Vue实战(四)登录/注册页的实现
  • 事件委托的小应用
  • 收藏好这篇,别再只说“数据劫持”了
  • 推荐一个React的管理后台框架
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 译有关态射的一切
  • 源码安装memcached和php memcache扩展
  • 云大使推广中的常见热门问题
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (02)Unity使用在线AI大模型(调用Python)
  • (1)虚拟机的安装与使用,linux系统安装
  • (LeetCode C++)盛最多水的容器
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (zt)最盛行的警世狂言(爆笑)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)mysql使用Navicat 导出和导入数据库
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET C# 使用 iText 生成PDF
  • .NET Reactor简单使用教程
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 通过系统影子账户实现权限维持
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • @SuppressWarnings注解
  • [ SNOI 2013 ] Quare
  • [ solr入门 ] - 利用solrJ进行检索
  • [04] Android逐帧动画(一)
  • [17]JAVAEE-HTTP协议
  • [Android] Android ActivityManager
  • [android] 天气app布局练习
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [asp.net core]project.json(2)
  • [BZOJ2208][Jsoi2010]连通数