久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

跨域與跨域訪問

 liang1234_ 2017-11-29

什么是跨域

跨域是指從一個域名的網(wǎng)頁去請求另一個域名的資源。比如從www.baidu.com 頁面去請求 www.google.com 的資源,??缬虻膰?yán)格一點(diǎn)的定義是:只要 協(xié)議,,域名,,端口有任何一個的不同,,就被當(dāng)作是跨域

為什么瀏覽器要限制跨域訪問呢,?

原因就是安全問題:如果一個網(wǎng)頁可以隨意地訪問另外一個網(wǎng)站的資源,,那么就有可能在客戶完全不知情的情況下出現(xiàn)安全問題。比如下面的操作就有安全問題:

  1. 用戶訪問www.mybank.com ,,登陸并進(jìn)行網(wǎng)銀操作,,這時cookie啥的都生成并存放在瀏覽器
  2. 用戶突然想起件事,并迷迷糊糊地訪問了一個邪惡的網(wǎng)站 www.xiee.com
  3. 這時該網(wǎng)站就可以在它的頁面中,,拿到銀行的cookie,,比如用戶名,登陸token等,然后發(fā)起對www.mybank.com 的操作,。
  4. 如果這時瀏覽器不予限制,,并且銀行也沒有做響應(yīng)的安全處理的話,那么用戶的信息有可能就這么泄露了,。

為什么要跨域

既然有安全問題,,那為什么又要跨域呢? 有時公司內(nèi)部有多個不同的子域,,比如一個是location.company.com ,而應(yīng)用是放在app.company.com , 這時想從 app.company.com去訪問 location.company.com 的資源就屬于跨域,。

跨域訪問需要的兩件寶貝

由于瀏覽器一般不對script,img等進(jìn)行跨域限制,,所以我們有機(jī)會通過script的方式來實(shí)現(xiàn)跨域訪問,。

跨域訪問需要用到兩樣?xùn)|東,一個是JSON,,一種基于文本的傳輸協(xié)議,;一種是JSONP,一群碼農(nóng)想出來的跨域解決方案,。關(guān)于JSON與JSONP的解釋,,可以參考 JSON & JSONP

實(shí)現(xiàn)跨域訪問 服務(wù)端需要做什么

服務(wù)端要檢查訪問的請求參數(shù),如果沒有callback,,則可以按照之前的流程走,;如果帶著callback參數(shù),則需要將返回的結(jié)果包裝在callback里面,。

比如請求的URL是: app.company.com/location?callback=myCallback , 那么服務(wù)端則需要把結(jié)果封裝進(jìn)myCallback 函數(shù)里面, 如下

if (params.query && params.query.callback) { //console.log(params.query.callback); var str = params.query.callback '(' JSON.stringify(data) ')';//jsonp res.end(str); } else { res.end(JSON.stringify(data));//普通的json }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

實(shí)現(xiàn)跨域訪問 客戶端需要做什么

客戶端有多種方式可以實(shí)現(xiàn)JSONP的調(diào)用:

  • jQuery
    jQuery可以在Ajax里面設(shè)置datatype為jsonp,,則可以進(jìn)行跨域訪問
$scope.jqueryJsonpRequest = function(){ jQuery.ajax({ type: 'get', async: false, url: 'https://public-api./rest/v1/sites/wtmpeachtest./posts', dataType: 'jsonp', jsonp: 'callback',//傳遞給請求處理程序或頁面的,,用以獲得jsonp回調(diào)函數(shù)名的參數(shù)名(一般默認(rèn)為:callback) jsonpCallback:'flightHandler',//自定義的jsonp回調(diào)函數(shù)名稱,默認(rèn)為jQuery自動生成的隨機(jī)函數(shù)名,,也可以寫'?',,jQuery會自動為你處理數(shù)據(jù) success: function(json){ alert('success' JSON.stringify(json)); }, error: function(){ alert('fail'); } }); };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • AngularJS
    AngularJS的$http 也提供了對jsonp的訪問,直接調(diào)用jsonp進(jìn)行跨域訪問
$http.jsonp('https://public-api./rest/v1/sites/wtmpeachtest./posts?callback=JSON_CALLBACK') .success(function(data){ alert('success:' data); }).error(function(err){ alert('error:' err); });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 手動實(shí)現(xiàn)
    不管是jQuery也好,,AngularJS也罷,,底下都不是發(fā)起XHR (XML HTTP Request),而都是通過加載javascript的方式來做的,,所以如果項(xiàng)目沒有依賴jQuery或者AngularJS,,則可以自己手動實(shí)現(xiàn)jsonp的調(diào)用。

    原理很簡單,,就是用javascript動態(tài)加載一個script文件,,同時定義一個callback函數(shù)給script執(zhí)行而已。

    //定義callback 函數(shù) var myCallbackFunction = function(data){ // 對返回的數(shù)據(jù)做后續(xù)處理 alert('uuu:' JSON.stringify(data)); } //把callback函數(shù)賦給window對象,供script回調(diào) window.myCallbackFunction = myCallbackFunction; //創(chuàng)建并加載script var script = document.createElement('script'); script.src = 'https://public-api./rest/v1/sites/wtmpeachtest./posts?callback=myCallbackFunction'; document.body.appendChild(script);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多