简单透彻理解JSONP原理及使用

spm FMRI 各种小问题合集 预处理 1、预处理结果从normalize之后开始头歪、变形 问题描述:如下图 原因:DICOM2NIfTI时必须检查对应的T1像。下面是两种错误形式,第一种容易发现,第二种容易忽视,大脑失状位左右颠倒。 解决:重新转了一回格式,建议用SPM fmri进行格式转换。之前是用MRIconvert转换的,用了两台电脑,有的T1结果是对的,不确定什么原因产生的错位,操作都是一样的。 2、Check reg大脑图片边缘出边框 问题描述: 原因:应该是图片排版导致的,单独check就会发现大脑是全的。 解决 阅读详情

参考地址:

https://blog.youkuaiyun.com/u011897301/article/details/52679486 

http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html。

       感觉看下来清晰明了,自己也跟着代码亲测了一遍,确实可行。我自己测试时,在本地设置虚拟主机,这样就拥有两个域名可以测试了。配置虚拟主机步骤可以百度,最后记得在 C:\Windows\System32\drivers\etc\hosts 文件加上设置的虚拟主机域名。

 

什么是JSONP

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

JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议。我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的“暗号”,而JSONP则是把用暗号书写的情报传递给自己同志时使用的接头方式。看到没?一个是描述信息的格式,一个是信息传递双方约定的方法。

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

 

1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;

2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>);

3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;

4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;

5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。

6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。

7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

8、ajax 的核心是通过 XmlHttpRequest 获取非本页内容,而 jsonp 的核心则是动态添加 <script> 标签来调用服务器提供的 js 脚本。

9、jsonp是一种方式或者说非强制性协议,如同ajax一样,它也不一定非要用json格式来传递数据,如果你愿意,字符串都行,只不过这样不利于用jsonp提供公开服务。

总而言之,jsonp不是ajax的一个特例,哪怕jquery等巨头把jsonp封装进了ajax,也不能改变!

JSONP原理

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

JSONP具体实现

1、首先看下ajax中如果进行跨域请求会如何。 

前端代码在域 localhost 下面,使用 ajax 发送了一个跨域到 local.sns.jutouit.com 的 get 请求

<!DOCTYPE html>
<html>
<head>
    <title>GoJSONP</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body>
<script type="text/javascript">
    function jsonhandle(data){
        alert("age:" + data.age + "  name:" + data.name + "  sex:"+data.sex);
    }
</script>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $.ajax({
            type : "get",
            async: false,
            url : "http://local.sns.jutouit.com/radius.php?id=1",
            type: "json",
            success : function(data) {
                jsonhandle(data);
            }
        });
    });
</script>
</body>
</html>

当访问前端代码 http://localhost/jsonp/demo.html  时 chrome报以下错误 

 

意思就是无法请求到 local.sns.jutouit.com 的资源,原因就是禁止了跨域请求资源。

2、下面使用 JSONP,将前端代码中的 ajax 请求去掉,添加了一个script标签,标签的 src 指向了另一个域 local.sns.jutouit.com 下的 remote.js 脚本

<!DOCTYPE html>
<html>
<head>
    <title>GoJSONP</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body>
<script type="text/javascript">
    function jsonhandle(data){
        alert("age:" + data.age + "  name:" + data.name + "  sex:"+data.sex);
    }
</script>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
</script>
<script type="text/javascript" src="http://local.sns.jutouit.com/remote.js"></script>
</body>
</html>

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

jsonhandle({
    "age" : 25,
    "name": "Yibin",
    "sex": "男"
});

这段远程的 js 代码执行了上面定义的函数,弹出了提示框如下:

3、这样就简单地解决了跨域获取数据的问题,但是 js 写死了,不够灵活,以下换成动态生成 html 元素并动态设置 js 的 src 属性等。

<!DOCTYPE html>
<html>
<head>
    <title>GoJSONP</title>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body>
<script type="text/javascript">
    function jsonhandle(data){
        alert("age:" + data.age + "  name:" + data.name + "  sex:"+data.sex);
    }
</script>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        var url = "http://local.sns.jutouit.com/test.php?id=1&callback=jsonhandle";
        var obj = $('<script><\/script>');
        obj.attr("src",url);
        $("body").append(obj);
    });
</script>

test.php 代码如下(更灵活的方法可以通过定义方法来获取指定数据,下面数据是写死的,测试方便而已。):

<?php
$data = array(
    'age' => 24,
    'name' => '小华',
    'sex' => '女'
);

$callback = $_GET['callback'];

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

意思同上一步是一样的,等价于 jsonhandle({key:value}); 也就是方法的定义。供前端页面调用。执行结果如下:

4、jQuery 提供了方便使用 JSONP 的方式,虽然类似 ajax 的请求,但是本质是不一样的,且只能使用 get 请求,代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>GoJSONP</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $.ajax({
            type : "get",
            async: false,
            url : "http://local.sns.jutouit.com/test.php?id=1",
            dataType: "jsonp",
            jsonp:"callback", //请求php的参数名
            jsonpCallback: "jsonhandle",//要执行的回调函数(参数值)
            success : function(data) {
                alert("age:" + data.age + "  name:" + data.name + "  sex:"+data.sex);
            }
        });
    });	
</script>
</body>
</html>

test.php 代码跟上面的一样。效果图如下:

至此,本文就结束了!谢谢原文作者,文字大部分是借来用的!代码稍作改动,效果截图自己亲测。

 

uniapp - 强力解决H5网页浏览器跨域问题,如何解决uniapp请求接口在浏览器跨域问题,UniApp H5 跨域代理配置详细教程完美解决所有uniapp跨域(调用第三方接口或服务器api跨域) uni-app 跨域,uniApp解决h5跨域问题,解决uni-app请求接口在浏览器跨域问题,uni.request请求跨域问题解决方案,uni-app-跨域解决方法,彻底解决uniapp发布为H5的跨域问题,uniapp H5页面设置跨域请求_uniapp h5跨域配置,uniapp开发 H5 解决跨域问题,uniApp请求解决跨域问题,uniapp request如何实现前端请求跨域,解决uniapp调试过程中的请求跨域和环境配置,Uniapp调用外部api接口跨域请求,uni-app发布H5页面跨域 阅读详情

相关推荐

Tomcat源码:Acceptor与Poller、PollerEvent

前文中我们介绍到NioEndpoint的start方法启动了Acceptor与Poller这两个异步线程来处理连接请求,本文我们就来接着介绍这两个组件。目录前言一、Acceptor1、构造方法2、run方法LimitLatchNioChannel二、Poller与PollerEvent2、pollerregisterruneventsprocessKey。

CRUD工程师 2065

jsonp原理详解

jsonp实现原理

jkzyx123的博客 1378

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一本程序化广告手册,深入挖掘数据处理的更多技巧。这本手册涵盖了程序化广告从概念到技术实现的诸多方面,而其中处处都涉及到数据处理,相信会给我们带来不少收获

yyy173611的博客 4572

jsonp原理详解——终于搞清楚jsonp是啥了

一、JSONP的由来 1、Ajax直接请求普通文件存在跨域无权限访问的问题,不管是静态页面、动态页面、web服务,只要是跨域请求,一律不准。 2、不过我们发现,web页面调用js文件则不受跨域的影响(不仅如此,我们还发现凡是拥有“src”这个属性的标签都拥有跨域的能力,比如<\script>、<\img>、<\iframe>)。 3、于是可以判断,当前阶段如果想通过纯web端跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用

学Java,找哪吒 2万+

电路课设-音响分频器电路设计

(一)题目简介 1.一阶分频器电路设计 假定高音和低音扬声器均等效为 16 欧姆电阻,设计如图 2 的简单分频器电 路,要求高低频分界(两个滤波器的截止频率)为 5kHz。 1) 写出高音扬声器和低音扬声器电压对于 vs 的传递函数,确定电路中电 容 C 和电感 L 的元件值;2)利用 AC 频率扫描分析求出两个扬声器电压的频率响应曲线,验证计算 结果。用包含高低频成分的电压 vs 激励进行测量验证。 3)计算并利用 EWB 仿真证明从 vs 看进去的阻抗为一常数 16 欧姆。

weixin_53507617的博客 1万+

Gartner DSG数据安全治理 架构及解读

目录背景:架构图: 解释:英文解释:(自上而下)平衡业务与风险、威胁、合规之间的关系(5个维度之间的平衡)优先处理数据集制定安全策略实施安全工具策略配置同步从上到下,从需求调研开始实施数据安全治理。千万不要跨过数据摸底、治理优先级分析、制定治理整体策略,而直接从技术工具开始对数据安全进行治理。 先明确选择需要治理的对象,优先选择重要数据进行数据安全治理工作。可以通过数据梳理、分类分级等手段,完成数据资产盘点和筛选,在纷杂的数据中理清头绪。

锦慈的技术博客 7216

JSONP原理与实现演示

本文介绍了一个JSONP原理与实现的交互式教学页面。该页面采用左右分栏设计,左侧详细解析JSONP跨域请求的核心原理,包括四个关键步骤:定义回调函数、创建Script标签、服务器返回数据、执行回调函数;右侧提供可运行的代码示例和交互式演示区域。页面通过可视化流程图、代码片段和实时请求演示,直观展示了JSONP的工作机制,同时指出其仅支持GET请求和潜在安全风险的技术局限性。整体设计采用响应式布局,结合代码高亮和交互元素,帮助开发者深入理解这一经典跨域解决方案。

油墨香^-^的博客 5553

FFTW库安装与使用(3.3.5版本)

FFTW库安装与使用一、FFTW库介绍与下载二、FFTW库安装三、FFTW库测试 一、FFTW库介绍与下载   FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散傅里叶变换的标准C语言程序集,其由MIT的M.Frigo 和S. Johnson 开发。可计算一维或多维实和复数据以及任意规模的DFT,且运行速度比Eigen和opencv自带的FFT库函数快10倍以上。   下载链接:http://www.fftw.org/install/wind

Jhon_ranble的博客 2万+

JSONP的使用

1、原生JSONP写法 /* * url: jsonp地址 * callback: 返回接收的函数名(String) */ function mockJsonp(url,callback){ var JSONP=document.createElement("script"); JSONP.type="text/javascript"; JSONP.src=`${url}?callback=${callback}`; document.getElementsByTagNam

yiyueqinghui的博客 2385

学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真

本文详细介绍了使用Simulink实现四开关Buck-Boost(FSBB)变换器无缝模式切换的仿真方法。FSBB变换器因其输入输出同极性、单电感和双向能量流特性,广泛应用于光伏储能、USB-PD和车载电源等场景。文章重点解决了模式切换中的直通风险和占空比跳变问题,通过统一电压PI控制、Stateflow模式仲裁和200ns死区设计,实现了Buck(26V→24V)、Pass-Through(24V±1V)和Boost(22V)三种工作模式的无缝过渡。仿真结果显示输出电压稳定在12V±0.15V,切换过程无

amy_mhd的博客 66

机器学习实战26-一种基于LightGBM的股市涨跌预测系统与代码实现过程

在全球经济一体化的背景下,股市作为经济活动的晴雨表,其波动与预测对于投资者、金融机构乃至国家政策制定者而言至关重要。随着金融市场的日益复杂化与信息量的爆炸式增长,股市分析不再仅限于基本面和技术面的传统研究,而是迫切需要更加精准、高效及智能化的方法来捕捉市场动态,以辅助决策制定。模型评估是确保LightGBM股市预测系统准确性和稳定性不可或缺的一环。通过综合运用多种评估指标、科学的验证方法以及深入的性能分析,我们不仅能够全面理解模型的能力和限制,还能为持续优化模型、提升预测准确性奠定坚实基础。

微学AI的博客 2327

jsonp 详解 —— 终于搞懂 jsonp 了

JSONP 不是一门编程语言,也不是什么特别的技术,它更像一个漏洞,程序员可以利用这个漏洞,实现跨域(可以简单理解为跨域名)传输数据。在介绍 JSONP 之前,先来介绍一下浏览器的同源策略。通过 jsonp,我们可以避开浏览器的同源策略,从而进行跨域请求。jsonp 是利用 HTML 标签的 src 属性引用资源不受同源策影响的特性来实现的,实现步骤如下:通过动态创建 script 标签,其 scr 指向非同源的 url,并传递一个 callback 参数给服务端。

M_emory_的博客 1万+

996引擎 - 读写变量性能测试

单轮100万次读写,取3轮平均耗时(毫秒),有效读取率均为100%,数值越小性能越优。

灵台方寸山斜月三星洞 244

理解JSONP

1.AJAX ajax是基于XMLHttpRequest 的,是不能跨域的。 request = new XMLHttpRequest(); request.onreadystatechange = function () { /*表示XMLHttpRequest对象的状态:0:未初始化。对象已创建,未调用open; 1:open方法成功调用,但Send方法未调用;

peng.zhou 364

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

透彻理解JSONP原理及使用

原 2016年09月27日 14:54:44阅读数:42048 什么是JSONP首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输。那么JSONP是什么呢? 首先抛出...

pullgo的博客 2161

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

关于JSONP的原理和JQ中使用JSONP

原文:http://www.cssdemon.me/?p=298 在web2.0的时代,ajax的盛行给web带来了翻天覆地的变化,允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用 XMLHttpRequest 函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器。不过,由于受到浏览器的限制,该方法不允许跨域通信。如果尝

每天进步一点点 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Jsonp原理理解

当我们用ajax请求一个跨域的域名时会报如下错误 这是因为浏览器基于同源策略,在同源策略下浏览器不允许AjAX跨域获取服务器数据 同源策略是浏览器的安全策略,指的是请求URL地址中的协议,域名和端口都与当前发送请求的页面相同,只要一处不同就是跨域请求。 那如果我们想跨域获取数据是不是就没办法了?我们知道标签的src属性实际上是支持跨域请求的 比如你的img标签可以引用一个网络图片,我们可以通过c...

Sumshine12.5 1506
上一篇: Linux学习之CentOS(十二)--crontab命令的使用方法
下一篇: windows 环境下装 composer
yibin94
博客等级 码龄11年 78粉丝 158原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值