無標題筆記

# 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閱讀 1,406評論 0 4
  • 2013-09-09xxxxxxxx asdfasfasdf[1] www@mail.com http://www...
    看客閱讀 195評論 3 1
  • 尋找一種易于理解的一致性算法(擴展版) 摘要 Raft 是一種為了管理復制日志的一致性算法。它提供了和 Paxos...
    yflau閱讀 1,035評論 0 1
  • 最近加班累成狗,回顧一年以前剛進入公司的躊躇滿志,到現在搞的自己暈頭轉向。很無奈,錯失了很多機會。總想著如果那時候...
    追云_似夢閱讀 179評論 0 2
  • 提起大學,大多數人首先聯想到的往往是青春、夢想與希望,但是身處大學之中的你會發現,更多時候是迷茫。大學里會遇到很多...
    夕夕醬閱讀 667評論 2 17