jsonp揭祕 原

什麼是JSONP?

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,而JSONP(JSON with Padding)則是JSON 的一種“使用模式”,通過這種模式可以實現數據的跨域獲取。

 

那什麼又是跨域呢?

簡單的來說,出於安全方面的考慮,頁面中的JavaScript無法訪問其他服務器上的數據,即“同源策略”。而跨域就是通過某些手段來繞過同源策略限制,實現不同服務器之間通信的效果。

 

同源策略

最初,它的含義是指,A網頁設置的 Cookie,B網頁不能打開,除非這兩個網頁"同源"。所謂"同源"指的是"三個相同"。

  • 協議相同
  • 域名相同
  • 端口相同

同源政策的目的,是爲了保證用戶信息的安全,防止惡意的網站竊取數據。

設想這樣一種情況:A網站是一家銀行,用戶登錄以後,又去瀏覽其他網站。如果其他網站可以讀取A網站的 Cookie,會發生什麼?

很顯然,如果 Cookie 包含隱私(比如存款總額),這些信息就會泄漏。更可怕的是,Cookie 往往用來保存用戶的登錄狀態,如果用戶沒有退出登錄,其他網站就可以冒充用戶,爲所欲爲。因爲瀏覽器同時還規定,提交表單不受同源政策的限制。

由此可見,"同源政策"是必需的,否則 Cookie 可以共享,互聯網就毫無安全可言了。

限制範圍

隨着互聯網的發展,"同源政策"越來越嚴格。目前,如果非同源,共有三種行爲受到限制。

(1) Cookie、LocalStorage 和 IndexDB 無法讀取。

(2) DOM 無法獲得。

(3) AJAX 請求不能發送。

 

陽光和陰影是上帝派給人間的雙胞胎,凡事有利既有弊,同源訪問策略給與我們安全的同時,也產生了很多的不方便,尤其現在前後端分離開發,部署的時候有很多前端與後端不是一個端口,甚至不是一個服務器。所以就產生了跨域訪問的需求

 

常見的跨域解決方案

jsonp

基本原理就是通過動態創建script標籤,然後利用src屬性進行跨域。但是隻支持GET請求方法

websocket

WebSocket protocol是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通信,同時允許跨域通訊,是server push技術的一種很好的實現。

cors

CORS是跨源資源分享(Cross-Origin Resource Sharing)的縮寫。它是W3C標準,是跨源AJAX請求的根本解決方法。相比JSONP只能發GET請求,CORS允許任何類型的請求。

 

我們本次重點要說的就是JSONP方法

  1. 通過上面的分析,我們知道Ajax直接請求普通文件存在跨域無權限訪問的問題,甭管你是靜態頁面、動態網頁、還是web服務,只要是跨域請求,一律不準。

 

  1. 不過我們又發現,Web頁面上調用js文件時則不受是否跨域的影響(不僅如此,我們還發現凡是擁有”src”這個屬性的標籤都擁有跨域的能力,比如<\script>、<\img>、<\iframe>)。

 

  1. 於是可以判斷,當前階段如果想通過純web端(ActiveX控件、服務端代理、屬於未來的HTML5之Websocket等方式不算)跨域訪問數據我們可以採用一種方法,那就是在遠程服務器上設法把數據裝進js格式的文件裏,供客戶端調用和進一步處理。

 

  1. 恰巧我們已經知道有一種叫做JSON的純字符數據格式可以簡潔的描述複雜數據,更妙的是JSON還被js原生支持,所以在客戶端幾乎可以隨心所欲的處理這種格式的數據。

 

  1. 這樣子解決方案就呼之欲出了,web客戶端通過與調用腳本一模一樣的方式,來調用跨域服務器上動態生成的js格式文件(一般以JSON爲後綴),顯而易見,服務器之所以要動態生成JSON文件,目的就在於把客戶端需要的數據裝入進去。

 

  1. 爲了便於客戶端使用數據,逐漸形成了一種非正式傳輸協議,人們把它稱作JSONP,該協議的一個要點就是允許用戶傳遞一個callback參數給服務端,然後服務端返回數據時會將這個callback參數作爲函數名來包裹住JSON數據,這樣客戶端就可以隨意定製自己的函數來自動處理返回數據了。

 

首先我們先看一個淘寶的Jsonp接口

http://suggest.taobao.com/sug?code=utf-8&q=關鍵字&callback=cb

 

那麼接下來我們就要自己手動封裝一個自己的jsonp

首先前端需要寫上我們想讓遠程服務器調用的函數,其次加上一個script標籤,此標籤路徑是遠程服務器的地址

代碼如下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章