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使用的一种重要技术 ...
随机推荐
- ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程
好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人>: --> 开篇:上一篇 ...
- Eclipse安装ZooKeeper插件
Eclipse在线安装插件奇慢的解决办法 安装ZooKeeper插件步骤如下:Step 1. 在 Eclipse 菜单打开Help -> Install New Software…Step 2. ...
- Mac安装Bower
1.安装bower,得首先安装node: brew install npm //npm是nodejs的程序包管理器,如果安装过nodejs,可忽略此步. 2.安装Git(因为需要从Git仓库获取一些代 ...
- Objective-C 外观模式--简单介绍和使用
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 在以下情况下可以考虑使用外观模式: (1)设计初期阶段,应该有意识的将不同层分 ...
- Windows组件:打开MSDTC,恢复Windows TaskBar,查看windows日志,打开Remote Desktop,打开Services,资源监控
一,Win10 打开 MSDTC 1,Win+R 打开运行窗口,输入 dcomcnfg,打开组件服务窗口 2,在组件服务 catalog下找到 Distributed Transaction Coor ...
- Security2:Create User
User 用于访问DB Users based on logins in master (This is the most common type of user.) User based on a ...
- C#设计模式系列:适配器模式(Adapter)
在实际的软件系统设计和开发中,为了完成某项工作需要购买一个第三方的库来加快开发.这带来一个问题,在应用程序中已经设计好的功能接口,与这个第三方提供的接口不一致.为了使得这些接口不兼容的类可以在一起工作 ...
- 记住密码超简单实现(C#)
实现效果如下 实现过程 [Serializable] class User { //记住密码 private string loginID; public string LoginID { get { ...
- MySQL学习笔记十六:锁机制
1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...
- Hawk: 无编程抓取淘女郎的所有高清照片
1.这是什么鬼? 哦?美女? 最近看了这一篇文章:http://cuiqingcai.com/1001.html 大概说的是用Python和Pyspider(这货好像是我的一位师兄写的,吓尿),抓取淘 ...