亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js跨域請求的5中解決方式

2019-11-20 12:07:11
字體:
來源:轉載
供稿:網友

跨域請求數據解決方案主要有如下解決方法:

JSONP方式表單POST方式服務器代理Html5的XDomainRequestFlash request

分開說明:

一、JSONP:

直觀的理解:

就是在客戶端動態注冊一個函數

function a(data),然后將函數名傳到服務器,服務器返回一個a({/*json*/})到客戶端運行,這樣就調用客戶端的

function a(data),從而實現了跨域.

誕生背景:

1、Ajax直接請求普通文件存在跨域無權訪問的問題,甭管是靜態頁面、動態網頁、web服務、wcf、只要是跨域請求,一律不行。

2、不過,web頁面上調用js文件時則不受此影響

3、進一步推廣,我們發現,凡是擁有Src屬性的標簽都有跨域能力,如:<script><img><iframe>

4、于是,當前如果想通過純web端(ActiveX控件、服務端代理、屬于未來的HTML5之Websocket等方式不算)跨域訪問數據,就只能使用如下方式:就是在遠程服務器上設法把數據裝進js格式的文本里,供客戶端調用和進一步處理。

5、JSON就是一種純字符數據格式,且能唄js原生支持。

6、這樣解決方案出爐:web客戶端通過與調用腳本一模一樣的方式,來調用跨域服務器上動態生成的js格式文件(一般以json為后綴)。

7、客戶端在對json文件調用成功后,也就得到了所需數據,剩下的就是按照自己的需求進行處理了。

8為了便于客戶端使用數據,逐漸形成了一種非正式的傳輸協議,稱之為jsonp。該協議的一個要點就是允許用戶傳遞一個callback參數給服務器,然后服務器返回數據時會將這個callback參數作為函數名來包裹住json數據,這樣客戶端就可以隨意定制自己的函數來處理返回數據了。

具體實現:

不管jQuery也好,extjs也罷,又或者是其他支持jsonp的框架,他們幕后所做的工作都是一樣的,下面我來循序漸進的說明一下jsonp在客戶端的實現:

1、我們知道,哪怕跨域js文件中的代碼(當然指符合web腳本安全策略的),web頁面也是可以無條件執行的。

遠程服務器remoteserver.com根目錄下有個remote.js文件代碼如下:

alert('我是遠程文件');

本地服務器localserver.com下有個jsonp.html頁面代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>  <title></title>  <script type="text/javascript" src="http://remoteserver.com/remote.js"></script></head><body></body></html>

毫無疑問,頁面將會彈出一個提示窗體,顯示跨域調用成功。

2、現在我們在jsonp.html頁面定義一個函數,然后在遠程remote.js中傳入數據進行調用。

jsonp.html頁面代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>  <title></title>  <script type="text/javascript">  var localHandler = function(data){    alert('我是本地函數,可以被跨域的remote.js文件調用,遠程js帶來的數據是:' + data.result);  };  </script>  <script type="text/javascript" src="http://remoteserver.com/remote.js"></script></head><body></body></html>

remote.js文件代碼如下:

localHandler({"result":"我是遠程js帶來的數據"});
運行之后查看結果,頁面成功彈出提示窗口,顯示本地函數被跨域的遠程js調用成功,并且還接收到了遠程js帶來的數據。很欣喜,跨域遠程獲取數據的目的基本實現了,但是又一個問題出現了,我怎么讓遠程js知道它應該調用的本地函數叫什么名字呢?畢竟是jsonp的服務者都要面對很多服務對象,而這些服務對象各自的本地函數都不相同啊?我們接著往下看。

3、聰明的開發者很容易想到,只要服務端提供的js腳本是動態生成的就行了唄,這樣調用者可以傳一個參數過去告訴服務端“我想要一段調用XXX函數的js代碼,請你返回給我”,于是服務器就可以按照客戶端的需求來生成js腳本并響應了。

看jsonp.html頁面的代碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>  <title></title>  <script type="text/javascript">  // 得到航班信息查詢結果后的回調函數  var flightHandler = function(data){    alert('你查詢的航班結果是:票價 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 張。');  };  // 提供jsonp服務的url地址(不管是什么類型的地址,最終生成的返回值都是一段javascript代碼)  var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";  // 創建script標簽,設置其屬性  var script = document.createElement('script');  script.setAttribute('src', url);  // 把script標簽加入head,此時調用開始  document.getElementsByTagName('head')[0].appendChild(script);   </script></head><body></body></html>

這次的代碼變化比較大,不再直接把遠程js文件寫死,而是編碼實現動態查詢,而這也正是jsonp客戶端實現的核心部分,本例中的重點也就在于如何完成jsonp調用的全過程。

我們看到調用的url中傳遞了一個code參數,告訴服務器我要查的是CA1998次航班的信息,而callback參數則告訴服務器,我的本地回調函數叫做flightHandler,所以請把查詢結果傳入這個函數中進行調用。

flightHandler({  "code": "CA1998",  "price": 1780,  "tickets": 5});

我們看到,傳遞給flightHandler函數的是一個json,它描述了航班的基本信息。運行一下頁面,成功彈出提示窗口,jsonp的執行全過程順利完成!

4、到這里為止的話,相信你已經能夠理解jsonp的客戶端實現原理了吧?剩下的就是如何把代碼封裝一下,以便于與用戶界面交互,從而實現多次和重復調用。

什么?你用的是jQuery,想知道jQuery如何實現jsonp調用?好吧,那我就好人做到底,再給你一段jQuery使用jsonp的代碼(我們依然沿用上面那個航班信息查詢的例子,假定返回jsonp結果不變):

OK,服務器很聰明,這個叫做flightResult.aspx的頁面生成了一段這樣的代碼提供給jsonp.html(服務端的實現這里就不演示了,與你選用的語言無關,說到底就是拼接字符串):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head>   <title>Untitled Page</title>   <script type="text/javascript" src=jquery.min.js"></script>   <script type="text/javascript">   jQuery(document).ready(function(){     $.ajax({       type: "get",       async: false,       url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",       dataType: "jsonp",       jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(一般默認為:callback)       jsonpCallback:"flightHandler",//自定義的jsonp回調函數名稱,默認為jQuery自動生成的隨機函數名,也可以寫"?",jQuery會自動為你處理數據       success: function(json){         alert('您查詢到航班信息:票價: ' + json.price + ' 元,余票: ' + json.tickets + ' 張。');       },       error: function(){         alert('fail');       }     });   });   </script>   </head> <body> </body> </html>

是不是有點奇怪?為什么我這次沒有寫flightHandler這個函數呢?而且竟然也運行成功了!哈哈,這就是jQuery的功勞了,jquery在處理jsonp類型的ajax時(還是忍不住吐槽,雖然jquery也把jsonp歸入了ajax,但其實它們真的不是一回事兒),自動幫你生成回調函數并把數據取出來供success屬性方法來調用,是不是很爽呀?

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品极品在线| 丰满岳妇乱一区二区三区| 日韩精品视频在线播放| 综合网中文字幕| 大量国产精品视频| 亚洲欧洲国产伦综合| 日韩三级影视基地| 亚洲第一男人天堂| 日韩亚洲综合在线| 亚洲缚视频在线观看| 亚洲网站视频福利| 精品色蜜蜜精品视频在线观看| 欧美另类69精品久久久久9999| 欧美一区二区三区精品电影| 欧美成人自拍视频| 深夜成人在线观看| 亚洲国内精品视频| 欧美激情奇米色| 久热在线中文字幕色999舞| 欧美激情亚洲激情| 国产一区二区三区视频| 日韩av中文在线| 九色精品免费永久在线| 亚洲欧美综合区自拍另类| 欧美激情国产精品| 久久99热精品这里久久精品| 国产91精品不卡视频| 日韩网站在线观看| 欧美尺度大的性做爰视频| 午夜精品在线观看| 国产精品黄色av| 亚洲日本欧美日韩高观看| 色偷偷噜噜噜亚洲男人的天堂| 久久久视频在线| 色综合老司机第九色激情| 日韩欧亚中文在线| 久久精品视频99| 国内外成人免费激情在线视频网站| 亚洲a∨日韩av高清在线观看| 欧美视频在线观看免费网址| 欧美巨乳在线观看| 国产精品美腿一区在线看| 日韩在线观看成人| 国产精品白丝jk喷水视频一区| 插插插亚洲综合网| 日韩美女激情视频| 国产日韩在线看片| 国产精品成人一区| 国产精品视频一| 91极品女神在线| 欧美老妇交乱视频| 日韩欧美在线中文字幕| 成人深夜直播免费观看| 日韩视频永久免费观看| 韩国视频理论视频久久| 日韩av电影免费观看高清| 日韩精品在线视频美女| 亚洲日韩中文字幕| 欧美国产第二页| 97热精品视频官网| 久久综合亚洲社区| 91精品国产乱码久久久久久蜜臀| 色婷婷综合久久久久中文字幕1| 成人激情视频在线播放| 国产在线精品播放| 欧美性生交大片免费| 国产精品久久久久久亚洲影视| 日本精品视频在线播放| 亚洲人成电影在线观看天堂色| 欧美亚洲另类激情另类| 欧美日韩日本国产| 久久久久久久久中文字幕| 国产不卡精品视男人的天堂| 国产精品偷伦视频免费观看国产| 精品精品国产国产自在线| 国产日韩欧美在线观看| 国产91在线高潮白浆在线观看| 日韩欧美中文字幕在线播放| 97热在线精品视频在线观看| 久久精品99无色码中文字幕| 亚洲毛片在线观看.| 亚洲第一区在线观看| 国产视频精品久久久| 亚洲一级免费视频| 国产日韩精品视频| 狠狠躁夜夜躁人人躁婷婷91| 91理论片午午论夜理片久久| 国产精品亚洲欧美导航| 亚洲欧美一区二区精品久久久| 欧美成人免费网| 欧美激情2020午夜免费观看| 日韩美女福利视频| 国产综合久久久久| 51视频国产精品一区二区| 日韩av在线最新| 欧美激情在线有限公司| 亚洲一区二区在线播放| 97精品一区二区视频在线观看| www.午夜精品| 国产精品自在线| 久久综合伊人77777| 亚洲国产精品久久久| 97色在线观看免费视频| 久久精品国产清自在天天线| 91在线观看免费高清完整版在线观看| 日韩欧美在线观看| 亚洲性夜色噜噜噜7777| 韩国三级日本三级少妇99| 亚洲精品女av网站| 一区二区亚洲精品国产| 亚洲欧美日韩网| 久久久久国产精品www| 精品国产区一区二区三区在线观看| 久久精品亚洲精品| 91人成网站www| 国产精品欧美一区二区| 日韩精品中文字幕有码专区| 亚洲国模精品私拍| 久久人人爽人人爽人人片av高清| 久久久久久久999精品视频| 久久精品国产v日韩v亚洲| 久久精品精品电影网| 久热精品视频在线| 欧美在线一区二区三区四| 国产精品99久久久久久久久| 亚洲乱亚洲乱妇无码| 日韩午夜在线视频| 国产日韩欧美中文| 国产精品久久久久91| 国语自产偷拍精品视频偷| 日韩视频免费观看| 91av在线免费观看| 欧美激情视频一区二区三区不卡| 成人在线播放av| 欧美性猛交xxxx富婆| 欧美裸体xxxx| 欧美激情xxxx性bbbb| 久久久久久国产精品三级玉女聊斋| 欧美—级a级欧美特级ar全黄| 欧美精品18videosex性欧美| 欧美另类极品videosbestfree| 亚洲精品自拍第一页| 国内精品模特av私拍在线观看| 91麻豆桃色免费看| 亚洲久久久久久久久久| 91精品视频免费观看| 精品无人区太爽高潮在线播放| 色噜噜久久综合伊人一本| 亚洲欧美日韩一区二区在线| 久久久久久高潮国产精品视| 国产精品久久在线观看| www欧美xxxx| 亚洲欧洲av一区二区| 欧美日韩成人免费| 欧美一级片久久久久久久| 亚洲欧洲视频在线| 日韩在线视频国产| 成人精品一区二区三区电影免费| 日韩69视频在线观看| 日韩亚洲欧美中文在线| 国产成人精品免高潮在线观看| 国产美女精彩久久| 91精品在线播放| www国产精品com|