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 ...
随机推荐
- c# datagridview表格控件常用操作
1) 行右键菜单 private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { ...
- 平庸与卓越的差别 z
本文是清华大学陈吉宁校长于在 2015 年第一次研究生毕业典礼暨学位授予仪式上的讲话,原文标题:选择与坚持.演讲非常精彩,值得您细细阅读. 亲爱的同学们: 今天,共有 1318 名同学获得博士.硕士学 ...
- LR 解决中文乱码(来源——百度)
因为我们使用的中文操作系统默认的中文编码格式是GB2312,所以LR对服务器的返回内容自动使用GB2312方式阅读的,但是几乎所有的中文网站现在都在使用UTF-8的方式来编码,由于解码编码的方式不同最 ...
- Python 异常相关参考
Python所有的异常都是从BaseException类派生的,常见的错误类型和继承关系如下: BaseException +-- SystemExit +-- KeyboardInterrupt + ...
- C++中 类的构造函数理解(一)
C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...
- 初学JavaScript(入门一)
javaScript是世界上最流行的脚本语言 在我们的手机.电脑设备上所浏览的所有网页,以及基于HTML5手机App的交互都是通过javaScript驱动的,所以javascript是前端工作的一 ...
- linux设置主机名
第一种方式: hostname 在hostname 命名后面直接加想要更改的主机名,修改成功,键入hostname可以查看修改后的主机名,此种方式会立即生效,但是重启后还原.不会永久修改 第二种方式: ...
- 传统企业,"哀兵必胜"的想法要不得
[文/ 任英杰]同事在内网上发了一篇文章『哀兵必胜』,思量数日,作文应对.文中表达的积极精神让人敬佩,但背后似乎隐含着一股莫名的“情绪”.对行业大格局的基本看法会影响公司转型的成败,觉得还是有必要讨论 ...
- 【转】SQL Server 数据库内部版本号
-----------数据库还原或版本升级出现版本错误时可参考. Internal SQL Server Database Version Numbers A database created by ...
- SpringMVC + Spring + MyBatis 学习笔记:SpringMVC和Spring一同工作的时候,AOP事务管理不起作用的解决方法
系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 SpringMVC 的 ...