狠狠网/色综合久久久久综合体桃花网/日本护士三aaaaaa/久久久久久综合一区中文字幕

或者

純前端解決跨域問題

作者:紫色年華 瀏覽:135 發(fā)布時間:2017-08-22
分享 評論 0

    跨域是由瀏覽器的同源策略引起的,是指頁面請求的url地址,必須與瀏覽器上的url地址處于同域上(即域名,端口,協(xié)議相同)。


    這是為了防止某域名下的接口被其他域名下的網(wǎng)頁非法調(diào)用,是瀏覽器對JavaScript施加的安全限制。


    這個措施的出發(fā)點是好的,但是程序頁面開發(fā)的過程中,卻常常給前端開發(fā)者帶來麻煩。


    由于前端開發(fā)過程中,靜態(tài)資源是放在本地電腦上的,訪問這些資源通常通過IP方式(127.0.0.1)或者localhosts來訪問,與線上服務(wù)器所在域名不符,不能順利調(diào)用服務(wù)的端口。


    解決跨域問題常用的解決方案有這兩個:


    JSONP:利用script標(biāo)簽可跨域的特點,在跨域腳本中可以直接回調(diào)當(dāng)前腳本的函數(shù)。


    CORS:服務(wù)器設(shè)置HTTP響應(yīng)頭中Access-Control-Allow-Origin的值,解除跨域限制。


    但是這兩個跨域方案都存在一個致命的缺陷,嚴(yán)重依賴后端的協(xié)助。


    開發(fā)中遇到的每一個接口都需要提前找后端進(jìn)行特殊的處理。而且即使后端愿意幫忙,某些接口不是隨便就能開放的(譬如已經(jīng)在上線正式環(huán)境的接口)。


    無論如何,依賴后端協(xié)助的跨域解決方案都會在一定程度上限制前端開發(fā)的進(jìn)度。


    那么有沒有前端獨立就能實現(xiàn)的跨域方案呢?有的,我們可以利用「代理」或「反向代理」技術(shù)來實現(xiàn)開發(fā)中的跨域問題。


    代理與反向代理


    代理


    代理,也稱正向代理,意思是一個位于客戶端和目標(biāo)服務(wù)器(target server)之間的服務(wù)器,為了從目標(biāo)服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個請求并指定目標(biāo)(目標(biāo)服務(wù)器),然后代理向目標(biāo)服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端。


    通俗地說:


    「客戶端」可以看作一個黑社會大佬,「目標(biāo)服務(wù)器」可以看作一家飯店,「代理服務(wù)器」可以看作小弟。


    「老大」想吃飯店的醬排骨飯,就讓「小弟」去買,「小弟」跑到「飯店」要個醬排骨飯。


    「飯店」醬排骨飯做好,送到「小弟」手上,「小弟」最后再把醬排骨飯拿給「大佬」。


    說白了,小弟就是個跑腿的,代理大佬的需求。


    數(shù)據(jù)流程:


    數(shù)據(jù)請求過程:瀏覽器-》代理服務(wù)器-》目標(biāo)服務(wù)器


    數(shù)據(jù)返回過程:目標(biāo)服務(wù)器-》代理服務(wù)器-》瀏覽器


    應(yīng)用:


    最經(jīng)典的應(yīng)用就是科學(xué)上網(wǎng):我是一個國內(nèi)用戶,我訪問不了google,但是我能訪問一個香港的某個代理服務(wù)器。


    這個香港的代理服務(wù)器可以訪問google,于是我先把請求發(fā)送到那個代理服務(wù)器,告訴他我需要訪問google,代理服務(wù)器去取內(nèi)容,最后返回給我。


    就好比,大佬被抓起來坐牢了,不能出去買醬排骨,只好拜托小弟去買回來。


    反向代理


    百度百科的解釋如下:


    反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器。


    數(shù)據(jù)流程:


    數(shù)據(jù)請求過程:瀏覽器-》【反向代理服務(wù)器-》處理數(shù)據(jù)的服務(wù)器】


    數(shù)據(jù)返回過程:【處理數(shù)據(jù)的服務(wù)器-》反向代理服務(wù)器】-》瀏覽器


    通俗地說:


    「瀏覽器」可以看作食客,「【反向代理服務(wù)器-》處理數(shù)據(jù)的服務(wù)器】」這一個整體可以看作飯店,其中「反向代理服務(wù)」相當(dāng)于點單的服務(wù)員。「處理數(shù)據(jù)的服務(wù)器」可以理解為是廚師。


    「食客」向來到「飯店」向「服務(wù)員」點菜,但服務(wù)員并不會真正去做菜,他是下達(dá)命令讓「廚師」去做菜。


    「廚師」把菜做好了給「服務(wù)員」,「服務(wù)員」再把菜端給「食客」。


    在外部看來,「代理服務(wù)器」和「處理數(shù)據(jù)的服務(wù)器」是一個整體。就好比,食客只會去飯店吃飯,而不是去找廚師吃飯(即對于瀏覽器來說,到達(dá)反向代理服務(wù)器已經(jīng)完成任務(wù)了,后面的操作則由反向代理服務(wù)器負(fù)責(zé))。


    具體飯店怎么操作,對食客是透明的。有可能某個服務(wù)員即當(dāng)服務(wù)器也當(dāng)廚師(即反向代理服務(wù)器和處理數(shù)據(jù)的服務(wù)器是同一臺PC機(jī))。


    補(bǔ)充一下,沒有反向代理,就好比沒有了服務(wù)員,食客直接向廚師要吃的。譬如,你餓了,直接叫媽媽做飯是一樣的(少了下訂單的步驟)


    比較


    從用途上來講:


    正向代理的典型用途是為在防火墻內(nèi)的局域網(wǎng)客戶端提供訪問Internet的途徑。正向代理還可以使用緩沖特性減少網(wǎng)絡(luò)使用率。


    反向代理的典型用途是為后端的多臺服務(wù)器提供負(fù)載平衡,或為后端較慢的服務(wù)器提供緩沖服務(wù)。


    從安全性來講:


    正向代理允許客戶端通過它訪問任意網(wǎng)站并且隱藏客戶端自身,因此你必須采取安全措施以確保僅為經(jīng)過授權(quán)的客戶端提供服務(wù)。


    反向代理對外都是透明的,訪問者并不知道自己訪問的是一個代理。


    從使用方來看:


    正向代理是瀏覽器端進(jìn)行配置的,與服務(wù)器端無關(guān),甚至可以對服務(wù)端隱藏。


    反向代理是服務(wù)器端配置的,對瀏覽器端是透明的。


    利用代理實現(xiàn)跨域


    實現(xiàn)原理


    對正向代理服務(wù)器進(jìn)行配置,當(dāng)獲取非接口數(shù)據(jù)時,讓代理服務(wù)器指向開發(fā)者本機(jī)的資源。當(dāng)訪問接口時,訪問后端接口數(shù)據(jù)。


    相當(dāng)于大佬讓小弟把醬排骨飯里面的飯和醬排骨分開買,飯自己家煮,醬排骨才去飯店買。


    程序運行過程


    瀏覽器訪問頁面,假設(shè)訪問淘寶頁面:taobao.com/index.html(假設(shè)這個頁面中調(diào)用了taobao.com/api/getNew獲取最新商品的接口)


    taobao.com/index.html請求經(jīng)過代理服務(wù)器,根據(jù)配置,index.html頁面請求127.0.0.1:3000


    127.0.0.1:3000返回index.html文件給瀏覽器。


    瀏覽器運行index.html頁面,發(fā)起taobao.com/api/etNew請求。


    taobao.com/api/getNew請求經(jīng)過代理服務(wù)器,但由于沒有對這個接口進(jìn)行特殊配置,會正常訪問淘寶服務(wù)器中的接口。


    淘寶服務(wù)器接受到taobao.com/api/getNew請求,檢查請求頭的hosts字段,發(fā)現(xiàn)是taobao.com,沒有跨域,將結(jié)果返回給代理服務(wù)器。


    代理服務(wù)器拿到結(jié)果,返回給瀏覽器,瀏覽器進(jìn)行解析顯示。


    代理配置(以mac下的charles為例)


    打開charles的映射關(guān)系表【charles->tool->Map Remote】。