2011-07-27 64 views
3

我試圖瞭解瀏覽器(也是Javascript新手)中的同一個源策略,並且跑到了wikipedia上的JSONP頁面。 How It Works部分說 -JSONP和XMLHttpRequest問題

現在,考慮可以指定任何URL,包括返回JSON的URL作爲元素的src>屬性。這意味着可以通過> HTML頁面中的腳本元素來檢索JSON。

但是,JSON文檔不是JavaScript程序。如果要由瀏覽器在元素中進行評估,則src URL的返回值必須是可執行的JavaScript。在JSONP使用模式中,URL返回動態生成的JSON,並在其中包含函數調用。這是JSONP的「填充」(或有時是「前綴」)。

我的問題是 -

  • 所以是的XMLHTTPRequest()應該返回只有JavaScript或HTML?它可以不返回純json文件嗎?
  • 我認爲相同的源策略不適用於XMLHttpRequest()調用。爲什麼需要在DOM中注入標籤以撥打第三方服務器?那麼網站上的所有廣告插件是如何呼叫家庭收集數據的?
  • 最後,我完全不理解JSONP。有人可以解釋一下嗎,或者請我介紹一下更好的解釋?

感謝,

- P

回答

7

所以是的XMLHTTPRequest()應該返回只有JavaScript或HTML?

它可以返回任何你喜歡的文字(也許二進制數據,但我從來沒有看到試過,所以我不會發誓的話)

能不回一個純粹的JSON文件?

它可以。

我認爲相同的源策略不適用於XMLHttpRequest()調用。

同源策略最肯定適用於XHR

爲什麼有需要注入標記到DOM做出第三方服務器的呼叫?

通過從另一個來源加載腳本(帶有嵌入數據)可以繞過相同的原點策略。

這是因爲您沒有使用JavaScript閱讀遠程資源。您正在執行一些附帶嵌入數據的遠程JavaScript。

在它的最後我完全不理解JSONP。有人可以解釋一下嗎,或者請我介紹一下更好的解釋?

JSON-P只是從另一個來源加載一些JavaScript。該JavaScript包含一個函數調用(對於您在添加<script>元素之前定義的函數)以及一個參數(JS對象或數組文本)。

+1

很好的答案。我會補充/澄清什麼使JSONP腳本源特別是它包含一個回調函數,因此它可以調用/影響您自己的腳本。 – Matt

+0

感謝您的回答!我也理解現在這篇文章中提到的XSS。 – user220201