1. 程式人生 > >JSONP跨域訪問資料傳輸

JSONP跨域訪問資料傳輸

JSON(JavaScript Object Notation)和JSONP(JSON with Padding)雖然只有一個字母的差別,但其實他們根本不是一回事兒

JSON是一種資料交換格式,而JSONP是一種依靠開發人員的聰明才智創造出的一種非官方跨域資料互動協議。我們拿最近比較火的諜戰片來打個比方,JSON是地下黨們用來書寫和交換情報的“暗號”,而JSONP則是把用暗號書寫的情報傳遞給自己同志時使用的接頭方式。看到沒?一個是描述資訊的格式,一個是資訊傳遞雙方約定的方法。

瀏覽器是存在同源策略這個機制的,在全域性層面禁止了頁面載入或執行與自身來源不同的域的任何指令碼。

JSONP是一種可以繞過瀏覽器的安全限制,從不同的域請求資料的方法。

Web頁面上呼叫js檔案時則不受是否跨域的影響(不僅如此,我們還發現凡是擁有”src”這個屬性的標籤都擁有跨域的能力,比如<script>、<img>、<iframe>);

如果想通過純web端(ActiveX控制元件、服務端代理、屬於未來的HTML5之Websocket等方式不算)跨域訪問資料就只有一種可能,那就是在遠端伺服器上設法把資料裝進js格式的檔案裡,供客戶端呼叫和進一步處理;JSON的純字元資料格式可以簡潔的描述複雜資料,被js原生支援,所以在web客戶端通過與呼叫指令碼一模一樣的方式,來呼叫跨域伺服器上動態生成的js格式檔案(一般以JSON為字尾),顯而易見,伺服器之所以要動態生成JSON檔案,目的就在於把客戶端需要的資料裝入進去。為了便於客戶端使用資料,逐漸形成了一種非正式傳輸協議,人們把它稱作JSONP,該協議的一個要點就是允許使用者傳遞一個callback引數給服務端,然後服務端返回資料時會將這個callback引數作為函式名來包裹住JSON資料,這樣客戶端就可以隨意定製自己的函式來自動處理返回資料了。

JSONP的原理是通過<script>標籤發起一個GET請求來取代XHR請求。JSONP生成一個<script>標籤並插到DOM中,然後瀏覽器會接管並向src屬性所指向的地址傳送請求。

當伺服器返回請求時,響應結果會被包裝成一個JavaScript函式,並由該請求所對應的回撥函式呼叫。

AngularJS在http服務中提供了一個JSONP輔助函式。通過
http服務的jsonp方法可以傳送請求,如下所示:

$http .jsonp("https://api.github.com?callback=JSON_CALLBACK") .success(function
(data) {
  // 資料 });

當請求被髮送時,AngularJS會在DOM中生成一個如下所示的<script>標籤:

<script src="https://api.github.com?callback=angular.callbacks._0" type="text/javascript"></script> 

注意,JSON_CALLBACK被替換成了一個特地為此請求生成的自定義函式。當支援JSOPN的伺服器返回資料時,資料會被包裝在由AngularJS生成的具名函式angular.callbacks._0中在這個例子中,GitHub伺服器會返回包含在回撥函式中的JSON資料,響應看起來如下所示: 

// 簡寫  

  angular.callbacks._0({ 

    'meta': {
      'X-RateLimit-Limit': '60',
      'status': 200
    },
    'data': {
      'current_user_url': 'https://api.github.com/user'
    }
  }) 

當AngularJS呼叫指定的回撥函式時會對$http的promise物件進行resolve。當我們自己開發支援JSONP的後端服務時,要確保響應的資料被包含在請求所指定的回撥函式中。使用JSONP需要意識到潛在的安全風險。首先,伺服器會完全開放,允許後端服務呼叫應用中的任何JavaScript。不受我們控制的外部站點(或者蓄意攻擊者)可以隨時更改指令碼,使我們的整個站點變得脆弱。伺服器或中間人有可能會將額外的JavaScript邏輯返回給頁面,從而將使用者的隱私資料暴露出來。由於請求是由<script>標籤傳送的,所以只能通過JSONP傳送GET請求。並且指令碼的異常也很難處理。使用JSONP一定要謹慎,同時只跟信任並可以控制的伺服器進行通訊。

一句話就是利用script標籤繞過同源策略,獲得一個類似這樣的資料,jsonpcallback是頁面存在的回撥方法,引數就是想得到的json。

Jquery中jsonp的使用

myUrl = "http://localhost:8090/api/test";

$.ajax({
  type:"GET",
  url:myUrl,
  dataType:"jsonp",
  jsonp:"callback",
  jsonpCallback:"jsonpCallback",
  success:function(data){
    alert(data.msg);
  }
});

function jsonpCallback(data){
  alert(data);
}

1.jsonp只能使用get請求,解決同源問題,返回javascript程式碼,因為請求javascript檔案是沒有同源問題的。
2.當請求資料型別為jsonp時,會將callback=jsonpCallback加在url上,http://localhost:8090/api/testcallback=jsonpCallback
3.前臺javascript中定義jsonpCallback函式,此函式必須定義在window下,也就是全域性的函式,否則找不到。
4.後臺獲取請求的callback引數值jsonpCallback,返回字串"jsonpCallback(result)",result為返回結果。
5.請求返回的是script tag,首先會呼叫jsonpCallback函式,不管是否找到該函式,都會呼叫success函式。
6.如果沒有定義jsonp和jsonpCallback,jsonp預設為"callback",jsonpCallback會是Jquery自動生成的函式名。

angularJS中jsonp的使用

myUrl = "http://localhost:8090/api/test?callback=JSON_CALLBACK";

$http.jsonp(myUrl).success(
  function(data){
    alert(data);
  }
);

1.angularJS中使用$http.jsonp函式
2.指定callback和回撥函式名,函式名為JSON_CALLBACK時,會呼叫success回撥函式,JSON_CALLBACK必須全為大寫。
3.也可以指定其它回撥函式,但必須是定義在window下的全域性函式。
4.url中必須加上callback
5.當callback為JSON_CALLBACK時,只會呼叫success,即使window中有JSON_CALLBACK函式,也不會呼叫該函式。

相關推薦

JSONP訪問資料傳輸

JSON(JavaScript Object Notation)和JSONP(JSON with Padding)雖然只有一個字母的差別,但其實他們根本不是一回事兒 JSON是一種資料交換格式,而JSONP是一種依靠開發人員的聰明才智創造出的一種非官方跨域資料

AngularJs---JSONP訪問資料傳輸

Jquery中jsonp的使用   myUrl = "http://localhost:8090/api/test"; $.ajax({   type:"GET",   url:myUrl,   dataType:"jsonp",   jsonp:"callback",  

在vue中使用jsonp訪問資料

1.首先在src目錄下建立一個api目錄,下面建立cofing.js和recommend.js檔案,在config.js檔案中是一些跨域訪問的引數:export const commonParams = { source: 'wap' //訪問時的公共引數 } exp

JSONP操作01_本地訪問資料訪問資料

1.jsonp簡介 json 是一種資料格式 jsonp 是一種資料呼叫的方式。 1)什麼是jsonp 為了便於客戶端使用資料,逐漸形成了一種非正式傳輸協議,人們把它稱作JSONP,該協議的一個要點就是允許使用者傳遞一個callback引數給服務端,然後服務端返回資料時會將

JQuery+ajax+jsonp 訪問

url .text java jquery rip getjson round show ajax <html> <head> <meta http-equiv="Content-Type" content="text/html; c

分享下知心天氣jsonp訪問的代碼

hmac blog ces ejs != 跨域 ucc think crypto var myWeather = (function(){ var funShun = "https://api.thinkpage.cn/v3/weather/now.js

jsonp訪問

.cn round win con clas response api bubuko click JavaScript解決API請求時的跨域處理問題1 <!DOCTYPE html> 2 <html lang="en"> 3 <head&

關於vue-cliaxsios的使用和訪問資料的總結

一、安裝axsois   1.安裝:在vue-cli根目錄下安裝axsois    2.更改原型鏈方法:在main.js下更改:   3.在元件中使用: 二、跨域   1.在config/index.js 新增如下程式碼: proxyTable: { './api':{ targ

在Vue中如何使用axios訪問資料

最近在專案中需要用到axios,所以就惡補一下這個axios到底是什麼東東。越來它是vue-resource的替代品,官網也說了,以後都用axios, vue-resource不在維護。那麼這個axios怎麼用呢,上網搜尋了一大堆,基本上都是雷同,我也不知道那些作者有沒有在

AJax與Jsonp訪問

目錄 一.JavaScript的AJax 二.JQuery的AJax 三.利用jsonp實現跨域訪問 一.JavaScript的AJax AJAX即“Asynchronous Javascript And XML”(非同步JavaScript和XML) 設計AJax使用的一種重要技術是XMLHttp

[JS]JSONP訪問百度地圖雲端儲存API

最近在寫一個基於百度地圖API實現的某旅遊村落電子地圖,在訪問百度地圖雲端儲存平臺上的資料表時出現了跨域問題,一開始我使用ajax獲取script,程式碼如下: function showDataz(data) { console.log("收到資料");

jsonp訪問的原理及引數作用

什麼是JSONP   先說說JSONP是怎麼產生的:   1、一個眾所周知的問題,Ajax直接請求普通檔案存在跨域無許可權訪問的問題,甭管你是靜態頁面、動態網頁、web服務、WCF,只要是跨域請求,一律不準;   2、不過我們又發現,Web頁面上呼叫js檔案時則不受是否跨域的影響(不僅如此,我們還發現凡

從前端和後端兩個角度分析jsonp訪問(完整例項)

一、什麼是跨域訪問 舉個栗子:在A網站中,我們希望使用Ajax來獲得B網站中的特定內容。如果A網站與B網站不在同一個域中,那麼就出現了跨域訪問問題。你可以理解為兩個域名之間不能跨過域名來發送請求或者請求資料,否則就是不安全的。跨域訪問違反了同源策略,同源策略的詳

JSONP讀取資料

json是一種資料傳輸格式,而jsonp是一種資料獲取的方式,沒有什麼相關性。jsonp是一種輕量級的資料傳輸方式,為什麼要使用jsonp呢?為什麼我們從不同的域(網站)訪問資料需要一個特殊的技術(JSONP )呢?這是因為同源策略。同源策略,它是由Netscape提出的一個

JSONP訪問實現登入驗證

最近在做一個手機Web專案,硬著頭皮上了。現在比較流行的就是使用Phonegap+HTML5+CSS+JS/JQuery做一個看起來native的mobile web app。但是由於時間急,而且這些東西都不是很熟悉,再加上這只是對已有web網站的mobile化,因此採用

Spring Boot支援JSONP請求資料(Ajax的jsonp)

1:在Spring Boot的Api伺服器上進行配置 package me.loveshare.note1.configuration; import org.springframework.web.

webpack+axios配置代理進行訪問資料

在學習vue的axios時,訪問自己的本地資料出現了跨域問題,如下圖 主要程式碼有 var root = 'http://172.16.188.107:8080/im' 、、、 getData() { this.$api.get('/data1

通過jsonp來實現訪問獲取資料!!!

通過jsonp來實現跨域訪問獲取資料的原理是什麼?通俗一點就是通過<script src="你要訪問的連結" type="text/javascript"></script>中的src來訪問你想要獲取資料的網址,並獲取資料。(不要問這啥這樣做就可以,

jsonp實現json資料訪問

為什麼會出現json資料跨域訪問限制? 這是因為所有支援Javascript的瀏覽器都會使用同源策略這個安全策略。看看百度的解釋: 同源策略,它是由Netscape提出的一個著名的安全策略。現在所有支援JavaScript 的瀏覽器都會使用這個策略。所謂同源是指,域名,協議

JSON和JSONP,原來ajax引用這個來實現訪問

第一個 下午 想要 進行 ava 客戶 als rep web客戶端 由於Sencha Touch 2這種開發模式的特性,基本決定了它原生的數據交互行為幾乎只能通過AJAX來實現。 當然了,通過調用強大的PhoneGap插件然後打包,你可以實現100%的Socket通訊和本