同源策略防止從壹個源加載的文檔或腳本獲取或設置從另壹個源加載的文檔的屬性。這個策略可以追溯到Netscape Navigator 2.0。
同源策略簡單來說就是動態內容(比如JavaScript或者VBScript)只能讀取那些與之同源的HTTP響應和cookies,而不能讀取不同來源的內容。更有趣的是,同源策略對寫操作沒有限制。
2、JSONP
以上同源策略是基於安全考慮,當前域不能訪問其他域的東西。但這也帶來了壹個問題,不同域之間如何輔助。
讓我們看壹個不同源請求的簡單例子。準備兩段代碼來模擬來自不同來源的兩臺服務器,並將它們部署在兩個不同的web容器上。為了方便起見,我們直接使用jquery進行異步請求,而不使用原生XMLHttpRequest。
localfile.html
Html代碼?集合代碼
& lt!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN " "/Ajax/libs/jquery/1.5/jquery . min . js " & gt;& lt/script & gt;?
& ltbody & gt?
& ltscript type = " text/JavaScript " & gt;?
$(文檔)。ready(function () {?
$.get('。/sayhello.js ',function(result){ });?
$.get('/jsonp/sayhello.js ',函數(結果){ });?
});?
& lt/script & gt;?
& lt/body & gt;?
& lt/html & gt;?
sayhello.js
Js代碼?集合代碼
alert(" hello jsonp ");?
這兩個文件同時放在遠程服務器freeyun.duapp.com和本地容器localhost上。
請訪問/jsonp/say hello . js . origin/jsonp/say hello . js " > & lt;/script & gt;?
& lt/head & gt;?
& ltbody & gt?
& lt/body & gt;?
& lt/html & gt;?
重新訪問localfile.html,所以還是會彈出hello jsonp的提示框,也就是說我們可以通過本地服務器訪問遠程服務器信息。
Html代碼?集合代碼
通過腳本標簽的開放策略,捕獲的數據不是JSON,而是任意的JavaScript,由JavaScript文字翻譯器執行而不是JSON解析器解析。?
JSON只是壹種數據描述格式。不管是JSONP還是其他的“XXP”和“YYP”其實只是兩個不同來源的服務器之間的數據交換采用什麽格式而已。
因為跨域請求主要是從其他服務器獲取數據,本地服務器在數據獲取完成後壹般會做相應的數據處理,所以在JSONP模式下,會要求將返回結果放入壹個本地回調函數中,這樣就可以通過本地回調方法直接處理數據,也就是我們常說的JSONP模式。