Angular4開(kāi)發(fā)解決跨域問(wèn)題詳解
1.跨域
瀏覽器對(duì)于javascript的同源策略的限制,例如a.cn下面的js不能調(diào)用b.cn中的js,對(duì)象或數(shù)據(jù)(因?yàn)閍.cn和b.cn是不同域),所以跨域就出現(xiàn)了.
上面提到的,同域的概念又是什么呢??? 簡(jiǎn)單的解釋就是相同域名,端口相同,協(xié)議相同
同源策略:
請(qǐng)求的url地址,必須與瀏覽器上的url地址處于同域上,也就是域名,端口,協(xié)議相同.
比如:我在本地上的域名是study.cn,請(qǐng)求另外一個(gè)域名一段數(shù)據(jù),這個(gè)時(shí)候在瀏覽器上會(huì)報(bào)錯(cuò),這個(gè)就是同源策略的保護(hù),如果瀏覽器對(duì)javascript沒(méi)有同源策略的保護(hù),那么一些重要的機(jī)密網(wǎng)站將會(huì)很危險(xiǎn)~
2.反向代理
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶(hù)端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。
3.Angular4跨域
Angular4項(xiàng)目分為工程代碼和生產(chǎn)代碼,在本地調(diào)試一般都是工程代碼,這樣聯(lián)調(diào)接口的話(huà),每次寫(xiě)一個(gè)接口都要丟到服務(wù)器上測(cè)試,嚴(yán)重影響效率,所以我們需要做的就是能在工程項(xiàng)目上聯(lián)調(diào)接口,隨時(shí)能看到效果,但是后端代碼不是部署在本機(jī)的話(huà)就會(huì)有跨域問(wèn)題,于是我們便需要去著重去解決跨域問(wèn)題!這樣后端代碼隨時(shí)改,前端也可以隨時(shí)更改看到效果,實(shí)現(xiàn)真正的前后端分離!
對(duì)于Angular4解決跨域問(wèn)題,應(yīng)該是開(kāi)發(fā)者已經(jīng)想到這個(gè)問(wèn)題,所以解決這個(gè)問(wèn)題很簡(jiǎn)單!那就是反向代理!!
下面介紹反向代理的方法:
1.首先需要建立一個(gè)JSON文件,文件名”proxy.config.json”
{
"/api":{
"target":"http://106.15.179.92"
}
}
http://106.15.179.92:為你連接機(jī)器的ip地址,或者你所需要請(qǐng)求的接口域名,這個(gè)就是需要被代理的
/api是代理的名稱(chēng),一般都是接口請(qǐng)求的ip地址后面的第一個(gè)參數(shù)名
比如:http://106.15.179.92/api/fron...為一個(gè)登錄的接口,反向代理后寫(xiě)接口請(qǐng)求的時(shí)候只需要寫(xiě)
this.$http.post(`/api/front/frontUserController/login.do`,data)
.then(res=>{
Console.log(res);
})
因?yàn)閔ttp://106.15.179.92已經(jīng)被代理到/api上!
2.然后配置”package.json”文件
"scripts": {
"ng": "ng",
"start": "ng serve --proxy-config proxy.config.json",
"build": "ng build --prod --aot",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
}
4.甩鍋解決跨域
跨域?和我們前端有關(guān)系?有嗎?沒(méi)有吧!我不解決,我就不解決,你們后端去解決!
現(xiàn)在介紹一種對(duì)于任何項(xiàng)目都通用的解決跨域的方法!
用nginx反向代理實(shí)現(xiàn)跨域,是最簡(jiǎn)單的跨域方式。只需要修改nginx的配置即可解決跨域問(wèn)題,支持所有瀏覽器,支持session,不需要修改任何代碼,并且不會(huì)影響服務(wù)器性能。
我們只需要配置nginx,在一個(gè)服務(wù)器上配置多個(gè)前綴來(lái)轉(zhuǎn)發(fā)http/https請(qǐng)求到多個(gè)真實(shí)的服務(wù)器即可。這樣,這個(gè)服務(wù)器上所有url都是相同的域名、協(xié)議和端口。因此,對(duì)于瀏覽器來(lái)說(shuō),這些url都是同源的,沒(méi)有跨域限制。而實(shí)際上,這些url實(shí)際上由物理服務(wù)器提供服務(wù)。這些服務(wù)器內(nèi)的javascript可以跨域調(diào)用所有這些服務(wù)器上的url。
下面,給出一個(gè)nginx支持跨域的例子,進(jìn)行具體說(shuō)明。
如,我們有兩個(gè)pythonflask開(kāi)發(fā)的項(xiàng)目:testFlask1和testFlask2。
testFlask2項(xiàng)目上的javascript腳本要通過(guò)ajax方式調(diào)用testFlask1的一個(gè)url,獲取一些數(shù)據(jù)。
正常情況下部署,就會(huì)有跨域問(wèn)題,瀏覽器拒絕執(zhí)行如下這樣的調(diào)用。
$("button").click(function () {
$.get("127.0.0.1:8081/partners/json", function (result) {
$("div").html(result);
});
});
下面把testFlask2項(xiàng)目的javascrip文件修改一下。這樣訪(fǎng)問(wèn)同源的url,就不會(huì)有跨域問(wèn)題。
$("button").click(function () {
$.get("partners/json", function (result) {
$("div").html(result);
});
});
但是,我們testFlask2項(xiàng)目實(shí)際上沒(méi)有partners/json這樣的url,那怎么處理呢?
我們這樣編寫(xiě)nginx的配置文件:
server{
listen8000;
location/ {
includeuwsgi_params;
uwsgi_passunix:/tmp/testFlask2.sock;
}
location/partners {
rewrite^.+partners/?(.*)$ /$1 break;
includeuwsgi_params;
uwsgi_passunix:/tmp/testFlask1.sock;
}
}
我們把testFlask2項(xiàng)目部署在8080端口的根目錄下。把提供web服務(wù)的testFlask1項(xiàng)目部署在/partners目錄下。
但我們的testFlask1項(xiàng)目并不能處理/partners/json這樣的url請(qǐng)求。那怎么辦呢?
通過(guò)rewrite^.+partners/?(.)$ /$1 break; 這一條命令,nginx可以把收到的/partners/請(qǐng)求全部轉(zhuǎn)為/*請(qǐng)求后再轉(zhuǎn)發(fā)給背后的真實(shí)web服務(wù)器。
這樣,RESTFUL的ajax客戶(hù)端程序,只需要給出特定前綴的url就可以調(diào)用任意服務(wù)器提供的RESTFUL接口了。
甚至,通過(guò)nginx的反向代理,我們還能調(diào)用其他公司開(kāi)發(fā)的網(wǎng)站提供的RESTFUL接口。
如,
location/sohu {
rewrite^.+sohu/?(.*)$ /$1 break;
includeuwsgi_params;
proxy_passhttp://www.sohu.com/;
}
我們就把sohu網(wǎng)站整個(gè)搬到我們的8080:/sohu/目錄下了,我們的javascript就可以盡情調(diào)用其RESTFUL服務(wù)了。
順便說(shuō)一下,rewrite^.+sohu/?(.)$ /$1 break; 這句命令中,$1表示(.)這個(gè)部分。第一對(duì)()內(nèi)的參數(shù)是$1,第二對(duì)()內(nèi)的參數(shù)就是$2,以此類(lèi)推。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Web前端框架Angular4.0.0 正式版發(fā)布
- Angular4 中常用的指令入門(mén)總結(jié)
- 淺談angular4生命周期鉤子
- Angular4學(xué)習(xí)筆記之準(zhǔn)備和環(huán)境搭建項(xiàng)目
- Angular4 中內(nèi)置指令的基本用法
- 詳解Angular4 路由設(shè)置相關(guān)
- 深入理解Angular4中的依賴(lài)注入
- angular4中關(guān)于表單的校驗(yàn)示例
- Angular4學(xué)習(xí)筆記之實(shí)現(xiàn)綁定和分包
- 淺談angular4 ng-content 中隱藏的內(nèi)容
- Angular4的輸入屬性與輸出屬性實(shí)例詳解
相關(guān)文章
解析AngularJS中g(shù)et請(qǐng)求URL出現(xiàn)的跨域問(wèn)題
本文主要介紹了AngularJS中g(shù)et請(qǐng)求URL出現(xiàn)跨域問(wèn)題。需要的朋友可以參考下2016-12-12
基于AngularJs + Bootstrap + AngularStrap相結(jié)合實(shí)現(xiàn)省市區(qū)聯(lián)動(dòng)代碼
這篇文章主要給大家介紹基于AngularJs + Bootstrap + AngularStrap相結(jié)合實(shí)現(xiàn)省市區(qū)聯(lián)動(dòng)的實(shí)例代碼,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-05-05
使用AngularJS 應(yīng)用訪(fǎng)問(wèn) Android 手機(jī)的圖片庫(kù)
這篇文章主要介紹了使用AngularJS 應(yīng)用訪(fǎng)問(wèn) Android 手機(jī)的圖片庫(kù)的相關(guān)資料,需要的朋友可以參考下2015-03-03
詳解Angular.js的$q.defer()服務(wù)異步處理
相信大家都知道jquery和angular都有defer服務(wù),這篇文章暫以angular為例談?wù)剛€(gè)人的理解,在文章的最后并附上jquery的阮一峰總結(jié)的defer。有需要的朋友們也可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11
AngularJS基于MVC的復(fù)雜操作實(shí)例講解
下面小編就為大家分享一篇AngularJS基于MVC的復(fù)雜操作實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
詳解Angular-cli生成組件修改css成less或sass的實(shí)例
這篇文章主要介紹了詳解Angular-cli生成組件修改css成less或sass的實(shí)例的相關(guān)資料,這里主要講解修改angular-cli.json文件,生成css或者less,需要的朋友可以參考下2017-07-07

