返回顶部
首页 > 资讯 > 前端开发 > JavaScript >一文看懂JSONP原理和应用
  • 345
分享到

一文看懂JSONP原理和应用

2024-04-02 19:04:59 345人浏览 独家记忆
摘要

目录什么是JSONPjsONP原理JSONP具体实现1.ajax中如果进行跨域请求会如何2.使用JSONP,将前端代码中的ajax请求去掉3.将前端代码再进行修改4.最后Jquery

什么是JSONP

首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前WEB应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输。

那么JSONP是什么呢?

首先抛出浏览器同源策略这个概念,为了保证用户访问的安全,现代浏览器使用了同源策略,即不允许访问非同源的页面,详细的概念大家可以自行百度。这里大家只要知道,在ajax中,不允许请求非同源的URL就可以了,比如www.a.com下的一个页面,其中的ajax请求是不允许访问www.b.com/c.PHP这样一个页面的。

JSONP就是用来解决跨域请求问题的,那么具体是怎么实现的呢?

JSONP原理

ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

JSONP具体实现

1.ajax中如果进行跨域请求会如何

前端代码在域www.practice.com下面,使用ajax发送了一个跨域的get请求


<!DOCTYPE html>
<html>
<head>
	<title>GoJSONP</title>
</head>
<body>
<script type="text/javascript">
	function jsonhandle(data){
		alert("age:" + data.age + "name:" + data.name);
	}
</script>
<script type="text/javascript" src="jquery-1.8.3.min.js">
</script>
<script type="text/javascript">
	$(document).ready(function(){
		$.ajax({
			type : "get",
			async: false,
			url : "Http://www.practice-zhao.com/student.php?id=1",
			type: "json",
			success : function(data) {
				jsonhandle(data);
			}

		});
	});
</script>
</body>
</html>

后端PHP代码放在域www.practice-zhao.com下,简单的输出一段json格式的数据

jsonhandle({

"age" : 15,

"name": "John",

当访问前端代码http://www.practice.com/gojsonp/index.html 时 chrome报以下错误

提示了不同源的URL禁止访问

2.使用JSONP,将前端代码中的ajax请求去掉

添加了一个script标签,标签的src指向了另一个域www.practice-zhao.com下的remote.js脚本


<!DOCTYPE html>
<html>
<head>
	<title>GoJSONP</title>
</head>
<body>
<script type="text/javascript">
	function jsonhandle(data){
		alert("age:" + data.age + "name:" + data.name);
	}
</script>
<script type="text/javascript" src="jquery-1.8.3.min.js">
</script>
<script type="text/javascript" src="http://www.practice-zhao.com/remote.js"></script>
</body>
</html>

这里调用了跨域的remote.js脚本,remote.js代码如下:


jsonhandle({
	"age" : 15,
	"name": "John",
})

也就是这段远程的js代码执行了上面定义的函数,弹出了提示框

3.将前端代码再进行修改

代码如下:


<!DOCTYPE html>
<html>
<head>
	<title>GoJSONP</title>
</head>
<body>
<script type="text/javascript">
	function jsonhandle(data){
		alert("age:" + data.age + "name:" + data.name);
	}
</script>
<script type="text/javascript" src="jquery-1.8.3.min.js">
</script>
<script type="text/javascript">
	$(document).ready(function(){
		var url = "http://www.practice-zhao.com/student.php?id=1&callback=jsonhandle";
		var obj = $('<script><\/script>');
		obj.attr("src",url);
		$("body").append(obj);
	});
</script>
</body>
</html>

这里动态的添加了一个script标签,src指向跨域的一个php脚本,并且将上面的js函数名作为callback参数传入,那么我们看下PHP代码怎么写的:


<?php
$data = array(
	'age' => 20,
	'name' => '张三',
);

$callback = $_GET['callback'];

echo $callback."(".json_encode($data).")";
return;

PHP代码返回了一段JS语句,即


jsonhandle({
	"age" : 15,
	"name": "张三",
})

此时访问页面时,动态添加了一个script标签,src指向PHP脚本,执行返回的JS代码,成功弹出提示框。
所以JSONP将访问跨域请求变成了执行远程JS代码,服务端不再返回JSON格式的数据,而是返回了一段将JSON数据作为传入参数的函数执行代码。

4.最后jQuery提供了方便使用JSONP的方式

代码如下:


<!DOCTYPE html>
<html>
<head>
	<title>GoJSONP</title>
</head>
<body>
<script type="text/javascript" src="jquery-1.8.3.min.js">
</script>
<script type="text/javascript">
	$(document).ready(function(){
		$.ajax({
			type : "get",
			async: false,
			url : "http://www.practice-zhao.com/student.php?id=1",
			dataType: "jsonp",
			jsonp:"callback", //请求php的参数名
			jsonpCallback: "jsonhandle",//要执行的回调函数
			success : function(data) {
				alert("age:" + data.age + "name:" + data.name);
			}

		});
	});
</script>
</body>
</html>

以上就是一文看懂JSONP原理和应用的详细内容,更多关于JSONP原理和应用的资料请关注编程网其它相关文章!

--结束END--

本文标题: 一文看懂JSONP原理和应用

本文链接: https://lsjlt.com/news/124185.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文看懂JSONP原理和应用
    目录什么是JSONPJSONP原理JSONP具体实现1.ajax中如果进行跨域请求会如何2.使用JSONP,将前端代码中的ajax请求去掉3.将前端代码再进行修改4.最后jQuery...
    99+
    2024-04-02
  • 一文看懂CDN加速原理
    CDN(Content Delivery Network)是一种通过在全球范围内分布节点服务器来提供高速内容传输和加速的技术。CDN...
    99+
    2023-09-21
    CDN
  • Yolov8原理详细解析!一文看懂
    引言 Yolo(You Only Look Once)是一种one-stage目标检测算法,即仅需要 “看” 一次就可以识别出图片中物体的class类别和边界框。Yolov8是Ultralytics公司最新推出的Yolo系列目标检测算法,可...
    99+
    2023-08-30
    Yolov8 目标检测 AI网络
  • 一文搞懂Golang中iota的用法和原理
    目录前言iota的使用iota在const关键字出现时将被重置为0按行计数所有注释行和空行全部忽略跳值占位多个iota一行多个iota首行插队中间插队没有表达式的常量定义复用上一行的...
    99+
    2024-04-02
  • 一文带你看懂VueHook和ReactHook
    目录react Hookreact Hook demovue Hookvue hook demoreact Hook 和 vue Hook 的区别react Hook React H...
    99+
    2023-05-18
    JavaScript Vue Hook和React Hook Vue Hook和React Hook
  • 一文彻底搞懂Vue的MVVM响应式原理
    目录前言Vue的MVVM原理创建一个html示例在MVue.js中创建MVue入口创建Compile1.处理元素节点compileElement(child)2.处理文本节点comp...
    99+
    2024-04-02
  • CMS 移动应用支持的奥秘:一文看懂
    内容管理系统 (CMS) 的移动应用支持对于确保在各种设备上无缝访问和管理网站内容至关重要。通过了解 CMS 移动应用支持的奥秘,您可以充分利用技术的力量,为用户提供无与伦比的移动体验。 理解移动应用支持 CMS 移动应用支持允许用户通过...
    99+
    2024-04-03
    引言
  • 一文搞懂HBase的基本原理
    HBase是一个分布式、可扩展的列式存储数据库,基于Hadoop的HDFS构建。它的基本原理可以概括为以下几点:1. 数据模型:HB...
    99+
    2023-09-23
    HBase
  • 一文搞懂MySQL持久化和回滚的原理
    目录redo log为什么要先更新内存数据,不直接更新磁盘数据?为什么需要redo log?redo log是如何实现的?为什么一个block设计成512字节?为什么要两段式提交?c...
    99+
    2024-04-02
  • 一篇文章看懂Java异常处理
    目录异常的定义异常的分类异常的处理方法try…catch处理throw 和throws自定义异常总结异常的定义 在java中,异常就是java在编译、运行或运行过程中出现的错误 总共...
    99+
    2024-04-02
  • 一篇文章带你彻底搞懂VUE响应式原理
    目录响应式原理图编译创建compile类操作fragment获取元素节点上的信息获取文本节点信息操作fragment响应式数据劫持收集依赖响应式代码完善Dep类全局watcher用完...
    99+
    2024-04-02
  • 一文带你搞懂Java中Synchronized和Lock的原理与使用
    目录1、Synchronized与Lock对比2、Synchronized与Lock原理2.1 Synchronized原理2.2 Lock原理3、Synchronized与Lock...
    99+
    2023-05-16
    Java Synchronized Lock原理 Java Synchronized Lock使用 Java Synchronized Java Lock Java Synchronized Lock
  • 一文搞懂JavaSPI机制的原理与使用
    目录SPI 概念举个栗子第一步第二步第三步第四步原理常用的框架优缺点优点缺点Java 程序员在日常工作中经常会听到 SPI,而且很多框架都使用了 SPI...
    99+
    2024-04-02
  • 一文搞懂MySQL运行机制原理
    目录前言mysql服务器体系架构网络连接层服务层存储引擎层系统文件层服务器处理客户端请求连接管理解析与优化查询缓存语法解析查询优化存储引擎小结前言 前文我们了解了MySQL采用客户端/服务器架构,用户通过客户端程序发送增...
    99+
    2024-04-02
  • 一文彻底搞懂IO底层原理
    目录一、混乱的 IO 概念二、用户空间和内核空间三、IO模型3.1、BIO(Blocking IO)3.2、“C10K”问题3.3、NIO非阻塞模型3.4、IO多路复用模型3.4.1...
    99+
    2024-04-02
  • 一文搞懂vue编译器(DSL)原理
    目录什么是DSLvue中的DSL实现思路源码下载 什么是DSL DSL是领域特定语言的缩写,与JavaScript这种通用语言编译器相对,它只针对某一个特殊应用场景工作 类似中英翻译...
    99+
    2023-05-18
    vue编译器DSL vue DSL
  • 一文读懂java中泛型的原理
    本篇文章给大家分享的是有关一文读懂java中泛型的原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是泛型?泛型(Generic type 或者 generics)是对 J...
    99+
    2023-05-31
    java 泛型 ava
  • Java Kubernetes 与 Java:一文读懂云原生应用的部署与管理
    一、Java Kubernetes 入门 Kubernetes 是一个开源的容器编排系统,用于自动部署、扩展和管理容器化应用程序。它允许您将应用程序打包为容器,然后在集群中的多个主机上运行和管理这些容器。 Java Kubernetes...
    99+
    2024-02-10
    Java Kubernetes 云原生 部署 管理
  • 一文读懂Java中动态代理的原理
    一文读懂Java中动态代理的原理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java动态代理分析及理解代理设计模式定义:为其他对象提供一种代理以控制对这个对象的访问。动态...
    99+
    2023-05-31
    java 动态代理 ava
  • 一文看懂Android.bp和Androd.mk区别以及宏变量对应关系
    目录 一、区别 二、mk转换为bp 三、宏变量对应关系 四、常用宏变量作用 一、区别 Android.bp --> Soong --> NinjaMakefile or Android.mk --> kati --> Ninja 最终都...
    99+
    2023-09-03
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作