无标题笔记

# jsonp原理讲解

## 原因

> 我们知道浏览器出于安全考虑,并不容许利用(XMLHTTP/XMLHttpRequest)发送跨域的ajax请求。

##解决办法(这里只讨论使用jsonp的方式)

> 同样我们也知道,对于img,css,script,是可以跨域引用的, 现在我们假设有一个网站a(www.a.com)的一个页面a1.aspx

引用了一个网站b(www.b.com)的javascript比如www.b.com/test.js。test.js里面输出一个alert(1);

这个结果我想大家都知道。现在又假如我们在a1.aspx里面有一个函数

```javascript

/*a1.aspx页面内容*/

function fa1(){

alert("1");

}

```

而test.js输出的内容为`fa1()`这个时候,显然浏览器也会弹出一个对话框了,里面的内容就是1。 说到这里大家也明白点东西了。

当我们需要跨域请求的时候,我们是不是完全可以利用js动态创建`<script>`标签,而将我们需要的参数附加的script标签的src地址的后面如下面这样

```html

<script src="http://www.b.com/test.js?id=12&cd=a"></script>

```

在www.b.com我们就可以得到这些参数,并输出一个跟服务器约定好的函数名,就系那个上面的例子中输出fa1()一样,当然了, 我们也可以利用像下面这样告诉www.b.com上面我们将要服务器输出才函数名字

```

<script src="http://www.b.com/test.js?id=12&cd=a&callback=callsuccess"></script>

```

www.b.com处理完后,输出callsuccess();就可以了。当然了callsuccess也是可以有任何参数的。这实际上就是所谓的jsonp

##jsonp缺点

* 目标域的服务器必须要如你所愿的输出一些你想要的脚本才可以。如上面才callback ,想象一下,假如www.b.com/test.js

输出的并非callsucess();而是输出alert(1)....说白了, 目标域,如果没有支持jsonp这种形式, 那么你是么有办法的。

* 只能是get请求

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • DBinding权威使用指南 标签(空格分隔): dbing 使用方式 layout: Activity: 一、设...
    天之界线2010阅读 5,199评论 0 4
  • 2013-09-09xxxxxxxx asdfasfasdf[1] www@mail.com http://www...
    看客阅读 1,274评论 3 1
  • 寻找一种易于理解的一致性算法(扩展版) 摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos...
    yflau阅读 4,620评论 0 1
  • 最近加班累成狗,回顾一年以前刚进入公司的踌躇满志,到现在搞的自己晕头转向。很无奈,错失了很多机会。总想着如果那时候...
    追云_似梦阅读 1,222评论 0 2
  • 提起大学,大多数人首先联想到的往往是青春、梦想与希望,但是身处大学之中的你会发现,更多时候是迷茫。大学里会遇到很多...
    夕夕酱阅读 3,868评论 2 17