JavaScript 跨域:谈谈跨域之 JSONP
在 Web 开发中,后台开发人员应该会通常遇到这个问题:跨域,而使用 JSONP 就是其中解决办法之一,当然,还有其它解决方法,比如:window.name、window.postMessage、CORS、iframe 之类。本文只介绍 JSONP。
首先,看看维基关于 JSONP 定义。
JSONP(JSON with Padding)是资料格式JSON的一种“使用模式”,可以让网页从别的网域要资料。另一个解决这个问题的新方法是跨来源资源共享。 由于同源策略,一般来说位于server1.example.com的网页无法与不是 server1.example.com的服务器沟通,而HTML的 <script>元素是一个例外。
利用 <script>元素的这个开放策略,网页可以得到从其他来源动态产生的JSON资料,而这种使用模式就是所谓的 JSONP。用JSONP抓到的资料并不是
JSON,而是任意的JavaScript,用 JavaScript直译器执行而不是用JSON解析器解析。
通过维基百科可知,JSONP( JSONP ) 简而言之:
在 JavaScript 中,涉及到跨域操作,通常会报出错误(SecurityError: Blocked a frame with origin "http://www.<domain>.com" from accessing a cross-origin frame.
)。
打个比方,在一个页面中,其 URL 为: www.jj.com ,而该页面中有一个 iframe,而该 iframe Src 属性值为 www.jj1.com ,在获取 iframe DOM 及进行操作,就会抛出上面错误。而在页面文件( HTML+CSS+Javascript)中,其中 script 、img、iframe等标签的 src 属性便没有这个限制,可指定取任何域链接。而 JSONP 便是利用此原理。
关于 Javascript 判断跨域,就是简单通过 url ,如果请求 url 与当前页面 url 中 协议不同(http、https)、域名不同、端口不同,甚至一个为域名,另一个为域名解析后 IP 服务器地址,也将认定为跨域。
JavaScript JSONP
1 首先,在页面 www.jj.com/index.html 中 <Script type='text/javascript'></script> 标签中,自定义一个函数 function ,假设为 A,函数体逻辑根据需求而定。
2 另外,再利用 <Script type='text/javascript' src='http://www.jj1.com/index.js'></script> src 属性无跨域限制,将 src 属性值设置为 跨域 url 地址。页面再加入该 index.js 文件,而 index.js 文件中,就是利用上一步页面中自定义的函数 A,而其内容可假设为 A()。
3 页面通过步骤二 Script 标签远程加载的 js,而其内容为 A(),而在该页面也已经声明了 函数 A,从而就成功执行了函数,实现了页面跨域。
jQuery JSONP
在知名 JavaScript 库:jQuery 中,同样对 JSONP 功能进行了封装,而其原理就是上方提到的 Script 标签 src 无跨域限制。不过,在 jQuery 中,因为该内容封装在 $.ajax(参数) 方法,而用户只需设置其参数(对象类型)的 datatype:”jsonp“、jsonpCallback:"函数名" (此处,若不设置,jQuery 内部将生成拼接成随机字符串),便可实现跨域。
此处,强调一点,虽然 jQuery 将 JSONP 功能封装在 $.ajax 中,而该功能实现实际与 ajax 没有任何关系,而完全是利用 script 标签 src 属性无跨域限制。
接下来,看看在 www.jianke.com 购物车功能实现中,便利用到了 $.ajax 中 JSONP 功能。
一 javascript 代码分析
二 http 协议请求分析
此外,本篇文章只大概讲了一下 JSONP,后续将会详细分析 $.ajax 实现原理。如有错误,烦请指正。
参考资料:http://www.cnblogs.com/twobin/p/3395086.html
https://zh.wikipedia.org/wiki/JSONP
JavaScript 跨域:谈谈跨域之 JSONP的更多相关文章
- [CORS:跨域资源共享] 同源策略与JSONP
Web API普遍采用面向资源的REST架构,将浏览器最终执行上下文的JavaScript应用Web API消费者的重要组成部分."同源策略"限制了JavaScript的跨站点调用 ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 跨域解决方案二:使用JSONP实现跨域
跨域的实现方式有多种,除了 上篇文章 提到的CORS外,常见的还有JSONP.HTML5.Flash.iframe.xhr2等. 这篇文章对JSONP的跨域原理进行了探索,并将我的心得记录在这里和大家 ...
- 什么是同源策略,什么是跨域,如何跨域,Jsonp/CORS跨域
同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响. 可以说Web是构建在同源策略基础之上 ...
- 跨域知识(二)——JSONP
JSONP是服务器与客户端跨源通信的常用方法.最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小. 它的基本思想是,网页通过添加一个<script>元素,向服务器请求JSON数据, ...
- Django跨域(前端跨域)
前情回顾 在说今天的问题之前先来回顾一下有关Ajax的相关内容 Ajax的优缺点 AJAX使用Javascript技术向服务器发送异步请求: AJAX无须刷新整个页面: 因为服务器响应内容不再是整个页 ...
- [转]html5: postMessage解决跨域和跨页面通信的问题
[转]html5: postMessage解决跨域和跨页面通信的问题 平时做web开发的时候关于消息传递,除了客户端与服务器传值,还有几个经常会遇到的问题: 多窗口之间消息传递(newWin = wi ...
- 文档通信(跨域-不跨域)、时时通信(websocket)、离线存储(applicationCache)、开启多线程(web worker)
一.文档间的通信 postMessage对象 //不跨域 1.iframe:obj.contentWindow [iframe中的window对象] iframe拿到父级页面的window: pare ...
- php 跨域、跨子域,跨服务器读取session
1.跨子域和跨服务器解决方式 Session主要分两部分: 一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在 另一个是标志着Session数据的Se ...
- 能跨域和跨浏览器的flashcookie for jquery插件
对于写网站时需要跨域和跨浏览器的可以看看这个. 引入jquery 和 swfstore.min.js 就可以了,蛮简单好用的,会jquery基础就可以咯. mySwfStore.set('myKey ...
随机推荐
- myeclipse安装
http://www.cnol.cc/2013/1427.html(我用这个) http://www.myeclipseide.cn/windows.html http://download.csdn ...
- JQuery Mobile实现手机新闻浏览器(2)
在上一篇文章中,已经讨论了程序的结构和页面的布局,并简单介绍了一些jQuery Mobile的使用技巧.在本篇文章中,笔者将继续完成我们web应用的新闻浏览器的设计. 程序的启动 我们现在来研究一下程 ...
- XX.frame.origin.x 赋值问题
can't use that myView.frame.origin.x=25.0; 因为.操作 和 = 一起用的话会调用 set方法.所以上式是行不通的. 可以用下面的方式来实现. that I h ...
- 网络编辑基础:对HTTP协议的头信息详解
HTTP(HyperTextTransferProtocol) 是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP 协议的详细内容请参 考RFC2616.HTTP协议采用了请求/响应模型 ...
- How do I list all tables/indices contained in an SQLite database
How do I list all tables/indices contained in an SQLite database If you are running the sqlite3 comm ...
- Delphi中实现MDI子窗体(转)
Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容 ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一 ...
- Maven安装testNG
1.Maven安装testNG (1)打开网站:http://testng.org/doc/maven.html (2)复制如下代码,粘贴到项目的pom.xml文件: 1 <dependency ...
- 应用scikit-learn做文本分类(转)
文本挖掘的paper没找到统一的benchmark,只好自己跑程序,走过路过的前辈如果知道20newsgroups或者其它好用的公共数据集的分类(最好要所有类分类结果,全部或取部分特征无所谓)麻烦留言 ...
- 关于python中字典的一些总结
1. 获取字典中的值,但是无异常 当在字典中取值的时候,可以使用如下两种方式: >>> d = {'name':'kel'} >>> d {'name': 'kel ...
- 阿里巴巴2013年实习生笔试题B
阿里巴巴集团2013实习生招聘技术类笔试题(B) 一.单向选择题 1.在常用的网络协议中,___B__是面向连接的.有重传功能的协议. A. IP B. TCP C. UDP D. DXP 2.500 ...