JSONP解决ajax跨域

跨域:跨域名

一个域名下的文件去请求了和他不一样的域名下的资源文件,就会产生跨域请求

JSONP : JSON with Padding

1.script标签

2.用script标签加载资源是没有跨域问题的

拿资源的标签:

1、<script>加载资源且无跨域问题,例如通常我们做测试可以直接去jquery引用在线库

2、<img src=”” >

3、<link>

<script>标签

src作用:加载(包含指定的外部文件)

1、可以跨域包含

2、被包含的资源可以是任何类型的文件(可以是txt,php等)

3、他只关注被包含的文件是否是合法的js

原理:

1、定义函数

2、包含外部文件,在被包含文件中执行调用定义好的函数

3、参数的(数据)的实现

问题:

1、包含就调用,通过动态创建<script>实现按需调用

2、包含动态文件时可以通过一个接口实现按需生成调用函数名称

知识点扩展:

计算机认知一个文件并不是文件名后缀所决定,文件名后缀作用只是方便我们人类容易区分和关联相关工具,文件的类型决定于其所包含的信息(内容)

——————————–网站资源引用——————————————————————————–

说明:下面讲的很难理解,仅供无聊查看

JSONP 网站 :http://bob.ippoli.to/archives/2005/12/05/remote-json-jsonp/

浏览器安全模型规定,XMLHttpRequest、框架(frame)等只能在一个域中通信。从安全角度考虑,这个规定很合理;但是,也确实给分布式(面向服务、混搭等等本周提到的概念)Web开发带来了麻烦。

为了实现跨域通信,通常的解决方案有3种:

本地代理:

需要一些硬件设施(没有服务器的客户端无法运行),并且带宽和潜伏时间也要加倍(远程服务器-代理服务器-客户端)。

Flash:

远程主机中需要部署一个crossdomain.xml文件,而且,Flash作为一门专有技术,其前途尚不明朗;换句话说,开发人员很可能要学习一种目标不确定的编程语言。

Script标签:

无法确切知道内容是否有效,没有标准的实现方法,又可能被认为是一种“安全风险”。

在此,我建议使用一种新技术,也是一种独立于标准的方法,即通过script标签来跨域获取数据,名为JSON with Padding,或者就叫JSONP。JSONP的原理很简单,但需要服务器端给予相应配合。大致来说,JSONP的实现思路就是在客户端编程时作好使用JSON数据的准备,然后再通过圆括号将这些数据括起来以创建一条有效的JavaScript语句(可能是一次有效的函数调用)。

也就是说,客户端可以使用一个用于命名jsonp的查询参数来决定可以获取的数据。最简单的情况下,如果jsonp参数为空,则返回的数据就是被括在圆括号中的JSON。

下面,我们就以del.icio.us的JSON API为例,来说明JSONP的原理。该API有一个“script tag”变量(即,可以将下面的URL作为script标签的src属性值,用以加载del.icio.us这个API提供的数据。——译者注)如下所示:

http://del.icio.us/feeds/json/bob/mochikit+interpreter:

if(typeof(Delicious) == ‘undefined’) Delicious = {};

Delicious.posts = [{

“u”: “http://mochikit.com/examples/interpreter/index.html”,

“d”: “Interpreter – JavaScript Interactive Interpreter”,

“t”: [

“mochikit”,”webdev”,”tool”,”tools”,

“javascript”,”interactive”,”interpreter”,”repl”

]

}]

如果用JSONP的方式来表示,那么与此具有相同语义的URL应该是这样的:

http://del.icio.us/feeds/json/bob/mochikit+interpreter?

jsonp=if(typeof(Delicious)%3D%3D%27undefined%27)

Delicious%3D%7B%7D%3BDelicious.posts%3D

单纯看这个URL似乎没有什么,但我们可以要求服务器在数据有效时给出通知。因此,我可以编写一个用于跟踪数据的小系统:

var delicious_callbacks = {};

function getDelicious(callback, url) {

var uid = (new Date()).getTime();

delicious_callbacks[uid] = function () {

delete delicious_callbacks[uid];

callback();

};

url += “?jsonp=” + encodeURIComponent(“delicious_callbacks[” + uid + “]”);

// 手工输入代码,向文档中插入script标签

};

getDelicious(doSomething, “http://del.icio.us/feeds/json/bob/mochikit+interpreter”);

根据以上假设,用于获取数据的URL应该如下所示:

http://del.icio.us/feeds/json/bob/mochikit+interpreter?jsonp=delicious_callbacks%5B12345%5D

delicious_callbacks[12345]([{

“u”: “http://mochikit.com/examples/interpreter/index.html”,

“d”: “Interpreter – JavaScript Interactive Interpreter”,

“t”: [

“mochikit”,”webdev”,”tool”,”tools”,

“javascript”,”interactive”,”interpreter”,”repl”

]

}])

可见,由于使用圆括号括住了返回的数据,这就相当于把一个JSONP请求转化成了一次函数调用,或者得到了一个纯粹的JSON直接量。服务器所要配合做的,就是在JSON数据的开头添加一小段文本(即回调函数的名称。——译者注)并将JSON数据放在括号中!

当然,接下来最好是使用Mochikit、Dojo等框架来抽象JSONP,从而让自己省去动手编写DOM以插入script标签的麻烦。

没错,JSONP只是解决了标准化的问题。假如远程主机想通过script标签向页面中注入恶意代码,而不是返回JSON数据,那么页面安全可能会 随时受到威胁。不过,一旦实现了JSONP,那么对开发人员来说肯定是一件省时省力的大好事,在此基础上各种一般化的抽象、教程及文档也会应运而生的。

授权协议:未知

开发语言: JavaScript

操作系统:跨平台

    原文作者:专业泡妞号
    原文地址: https://www.jianshu.com/p/12d08b1654f6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞