Jsonp跨域访问
很早之前看过好几篇跨域访问的文章,然后做项目的时候基本没有遇到跨域访问的问题。不过该来的还是会来,前些天终于让我遇到了。于是重温了一下原理这些,再进行实战。于是现在也敢通过实战后的一些理解来和大家分享了。
我们今天主要来分享的就是jsonp的跨域访问。
我们将从这几个方面来分析jsonp跨域访问
- 跨域访问是什么
- json是什么
- jsonp是什么
- 如何进行jsonp跨域访问
1.跨域访问是什么
我们先明白一个概念:同源策略
同源策略是一种浏览器的安全策略,一个脚本不能去执行另一个和他不同源的脚本内容。所谓同源指的是域名,协议,端口三个都要相同。所以当我们通过js获取第三方的数据时(比如通过第三方API获取json数据),,浏览器是不允许我们直接这样做的。所以我们得使用一种技巧去访问不同域,然后获得该域的数据。这个就是跨域访问。
2.json是什么
JSON: JavaScript Object Notation(JavaScript 对象表示法)通过名字我们就大概可以知道是个啥了,json是一种轻量级的数据交换格式,而这个格式又是遵循的js的对象语法。所以个人认为json可以直接看做是js的一个子集。
3.jsonp是什么
jsonp:json with padding 我们来翻译一下就是:用来填充的json数据。咦?为什么要这么叫呢。后面当我们讲到jsonp的原理的时候,你就会知道这样取名字的原因了(题外话:取名字真的是个技术活啊。每次遇到函数,变量比较多,如何取个好名字真的很重要)说人话就是:jsonp就是一种访问数据的非官方传输协议。
4.如何进行jsonp跨域访问
通过前面我们可以知道由于同源策略,我们无法通过ajax直接去访问另一个域名下的文件。那这时我们怎么办,别急,直接不行,我们间接还不行吗。我们仔细想想我们的script标签,它是可以获取任何地方的文件的啊。我们可以通过它来帮我们获取我们想要的东西。具体如何操作呢,我们来看例子吧.
首先我们幻想一下我们获得了数据之后我们要干什么,我们把获取的数据显示在页面上吧。
页面的html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试文件</title>
</head>
<body>
<div>
<h1>显示跨域访问获得的数据</h1>
<div id="show">
</div>
</div>
</body>
</html>
我们再在页面中直接添加js函数来处理数据吧
function show(data)//data参数就是我们从另一个域获取到的数据
{
var node = document.getElementById('show');
p.innerHTML=p.innerHTML="这就是获取到的数据 "+data;
}
我们是直接把获取的数据显示出来
然后我们现在去获取数据,我们再添加一个节点,里面的src就是我们要访问的第三方的url,只是在url后面我们额外添加一个callback参数。
这是整个的代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试文件</title>
</head>
<body>
<div>
<h1>显示跨域访问获得的数据</h1>
<div id="showdata">
</div>
</div>
<script type="text/javascript">
function show(data)//data参数就是我们从另一个域获取到的数据
{
var node = document.getElementById('showdata');
p.innerHTML=p.innerHTML="这就是获取到的数据 "+data;
}
</script>
<script type="text/javascript" src="url?callback=show"></script>
</body>
</html>
大家需要注意的是src="url?callback=show",我们把之前定义的show函数作为callback参数传递给服务器端,这个函数就是一个回调函数,具体过程是这样:
一个前提是我们使用jsonp是需要服务器端来配合的,我们通过url访问到服务器的地址,并且传递了一个callback参数给服务器端,然后服务器端能够接收这个参数,然后将数据以json格式作为show函数的参数传递给它,也就是用json数据来填充这个show函数(现在明白叫jsonp的原因了吧),然后调用这个函数,最后因为这个函数被执行,我们的html中的div中就会显示出获取到的数据。
不过这样可能会显得死板,固定了什么时候调用。我们可以动态生成一个script节点,这样我们就可以在需要数据的时候动态调用了,这样就会更合理。我还是上一下完整代码吧
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试文件</title>
</head>
<body>
<div>
<h1>显示跨域访问获得的数据</h1>
<div id="showdata">
</div>
</div>
<script type="text/javascript">
//data参数就是我们从另一个域获取到的数据
function show(data)
{
var node = document.getElementById('showdata');
p.innerHTML=p.innerHTML="这就是获取到的数据 "+data;
}
function invokeRemoteData()
{
var node=document.createElement("script");
//remoteUrl就是第三方服务器的地址
var url=remoteUrl?callback=show ;
node.setAttribute("src",url);
var head=document.getElementsByTagName("head")[0];
//将创建的script节点添加到head的最后,调用开始
head.appendChild(node);
}
</script>
</body>
</html>
当我们需要获取跨域数据时,直接调用invokeRemoteData函数,html页面中就会显示出获取到的数据。
总结一下,完成jsonp跨域访问所需要做的步骤:
- 创建一个函数,这个函数是用来处理获取到的数据
- 给要访问的远程url添加一个callback参数并将之前创建的处理函数作为callback参数的值
- 可以添加一个方法来动态创建一个script标签以此来动态获取数据
ps:
- 此前提到了回调函数,简单说回调函数就是把该函数当做参数传递给另外一个函数,然后在需要的时候在这个函数中调用传入的回调函数。
- 推荐两篇jsonp讲的很好的博客,廖雪峰ajax 和 随它去吧-jsonp 这两位都是大牛,我的这篇只是我的个人理解,大家可以多看看不同的人写的,然后总结一下
- 还推荐一个跨域访问的方法:就是服务器端代理,先请求服务器,然后服务器端帮你请求需要的文件再response给你。
Jsonp跨域访问的更多相关文章
- 在ASP.NET MVC3 中利用Jsonp跨域访问
在ASP.NET MVC3 中利用Jsonp跨域访问 在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复 ...
- jquery ajax怎么使用jsonp跨域访问
在项目中使用接口的比较多,在客户端跨域访问,jquery中只能使用jquery ajax的jsonp方法. 值得注意的是,jQuery.ajax()只支持get方式的跨域,post的方式是不支持的.& ...
- Jsonp跨域访问原理和实例
>>什么是跨域 出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,当前域名的js只能读取同域下的窗口属性,即同源策略.而跨域就是通过某些手段来绕过同源策略限制,实 ...
- 【AngularJs】---JSONP跨域访问数据传输
大家会自然想到只有一个字母之差的JSON吧~ JSON(JavaScript Object Notation)和JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不 ...
- [转载]介绍一个JSONP 跨域访问代理API-yahooapis
你是否遇到了想利用AJAX访问一些公网API,但是你又不想建立自己的代理服务,因为有时我根本就没打算涉及服务端任何代码,但是讨厌的浏览器的同源策略,阻止了我们的ajax调用. 比如我想访问一个天气的r ...
- 从前端和后端两个角度分析jsonp跨域访问(完整实例)
一.什么是跨域访问 举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请 ...
- JSONP跨域访问百度实现搜索提示小案例
一.JSONP简介 JSONP 全称 JSON with padding(填充式 JSON 或参数式 JSON),JSONP实现跨域请求的原理,就是动态创建<script>标签,然后利用& ...
- 【AngularJs】---JSONP跨域访问数据传输(JSON_CALLBACK)
大家会自然想到只有一个字母之差的JSON吧~ JSON(JavaScript Object Notation)和JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不 ...
- AJax与Jsonp跨域访问
一.JavaScript的AJax AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML) 设计AJax使用的一种重要技术 ...
随机推荐
- Python黑帽编程2.8 套接字编程
Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...
- ECMAScript 6入门
预计在2014年底,ECMAScript 6将会正式发布,他的草案在13年3月份被冻结,后续提出新特性将会移至ECMASript 7中.目前还没有哪款浏览器实现了ES6的全部内容,兼容性最强的一款要数 ...
- 2016苹果春季发布会 iPhone SE发布
配置如下 主屏尺寸:4英寸 主屏分辨率:1336x640像素 后置摄像头:1200万像素 前置摄像头:120万像素 电池容量:1624mAh 核心数:双核 操作系统:iOS 9 核心数:双核 CPU: ...
- C# BS消息推送 SignalR Hubs环境搭建与开发(二)
1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 2. 开始开发 1)新建一个MVC项目,叫做SignalRDemo 2)安装SignalR包 In ...
- 使用sklearn做单机特征工程
目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺 ...
- Android笔记——eclipse快捷键
查看快捷键定义的地方 Window->Preferences->General->Keys. 编辑相关快捷键 1. [ALT+/] 自动提示方法 此快捷键为用户编辑的好帮手,能为用户 ...
- css绝对定位如何在不同分辨率下的电脑正常显示定位位置?
有时候我们在写页面中,会发现绝对定位的父级元素已经相对定位了,但是在不同分辨率的电脑下,绝对定位还是会错乱,似乎父级的相对定位并没有起了作用. 首先要明白如下几个原理: 1.笔记本电脑的分辨率一般为1 ...
- 由ArcMap属性字段自增引出字段计算器使用Python的技巧
1.前言 前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增.所以我打开ArcCatalog查看发现只提供默认值 ...
- LINQ系列:LINQ to SQL Take/Skip
1. Take var expr = context.Products .Take(); var expr = (from p in context.Products select p) .Take( ...
- 进程管理三大扩展工具htop
三大进程管理监控工具 HTOP 介绍: Htop是一款运行于Linux系统监控与进程管理软件,htop提供所有进程的列表,并且使用彩色标识出处理器.swap和内存状态.用户一般可以在top无法提供详尽 ...