溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Angular4如何開發解決跨域問題

發布時間:2021-08-02 14:26:07 來源:億速云 閱讀:164 作者:小新 欄目:web開發

這篇文章主要介紹了Angular4如何開發解決跨域問題,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1.跨域

瀏覽器對于javascript的同源策略的限制,例如a.cn下面的js不能調用b.cn中的js,對象或數據(因為a.cn和b.cn是不同域),所以跨域就出現了.

上面提到的,同域的概念又是什么呢??? 簡單的解釋就是相同域名,端口相同,協議相同

同源策略:

請求的url地址,必須與瀏覽器上的url地址處于同域上,也就是域名,端口,協議相同.

比如:我在本地上的域名是study.cn,請求另外一個域名一段數據,這個時候在瀏覽器上會報錯,這個就是同源策略的保護,如果瀏覽器對javascript沒有同源策略的保護,那么一些重要的機密網站將會很危險~

2.反向代理

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。

3.Angular4跨域

Angular4項目分為工程代碼和生產代碼,在本地調試一般都是工程代碼,這樣聯調接口的話,每次寫一個接口都要丟到服務器上測試,嚴重影響效率,所以我們需要做的就是能在工程項目上聯調接口,隨時能看到效果,但是后端代碼不是部署在本機的話就會有跨域問題,于是我們便需要去著重去解決跨域問題!這樣后端代碼隨時改,前端也可以隨時更改看到效果,實現真正的前后端分離!
對于Angular4解決跨域問題,應該是開發者已經想到這個問題,所以解決這個問題很簡單!那就是反向代理!!

下面介紹反向代理的方法:

1.首先需要建立一個JSON文件,文件名”proxy.config.json”

{
 "/api":{
  "target":"http://106.15.179.92"
 }
}

http://106.15.179.92:為你連接機器的ip地址,或者你所需要請求的接口域名,這個就是需要被代理的

/api是代理的名稱,一般都是接口請求的ip地址后面的第一個參數名

比如:http://106.15.179.92/api/fron...為一個登錄的接口,反向代理后寫接口請求的時候只需要寫

this.$http.post(`/api/front/frontUserController/login.do`,data)
   .then(res=>{
       Console.log(res);
})

因為http://106.15.179.92已經被代理到/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.甩鍋解決跨域

跨域?和我們前端有關系?有嗎?沒有吧!我不解決,我就不解決,你們后端去解決!

現在介紹一種對于任何項目都通用的解決跨域的方法!

用nginx反向代理實現跨域,是最簡單的跨域方式。只需要修改nginx的配置即可解決跨域問題,支持所有瀏覽器,支持session,不需要修改任何代碼,并且不會影響服務器性能。

我們只需要配置nginx,在一個服務器上配置多個前綴來轉發http/https請求到多個真實的服務器即可。這樣,這個服務器上所有url都是相同的域名、協議和端口。因此,對于瀏覽器來說,這些url都是同源的,沒有跨域限制。而實際上,這些url實際上由物理服務器提供服務。這些服務器內的javascript可以跨域調用所有這些服務器上的url。

下面,給出一個nginx支持跨域的例子,進行具體說明。

如,我們有兩個pythonflask開發的項目:testFlask1和testFlask2。

testFlask2項目上的javascript腳本要通過ajax方式調用testFlask1的一個url,獲取一些數據。

正常情況下部署,就會有跨域問題,瀏覽器拒絕執行如下這樣的調用。

$("button").click(function () {
  $.get("127.0.0.1:8081/partners/json", function (result) {
    $("div").html(result);
  });
});

下面把testFlask2項目的javascrip文件修改一下。這樣訪問同源的url,就不會有跨域問題。

$("button").click(function () {
  $.get("partners/json", function (result) {
    $("div").html(result);
  });
});

但是,我們testFlask2項目實際上沒有partners/json這樣的url,那怎么處理呢?

我們這樣編寫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項目部署在8080端口的根目錄下。把提供web服務的testFlask1項目部署在/partners目錄下。

但我們的testFlask1項目并不能處理/partners/json這樣的url請求。那怎么辦呢?

通過rewrite^.+partners/?(.)$ /$1 break; 這一條命令,nginx可以把收到的/partners/請求全部轉為/*請求后再轉發給背后的真實web服務器。

這樣,RESTFUL的ajax客戶端程序,只需要給出特定前綴的url就可以調用任意服務器提供的RESTFUL接口了。

甚至,通過nginx的反向代理,我們還能調用其他公司開發的網站提供的RESTFUL接口。

如,

location/sohu {
 rewrite^.+sohu/?(.*)$ /$1 break;
 includeuwsgi_params;
 proxy_passhttp://www.sohu.com/;
}

我們就把sohu網站整個搬到我們的8080:/sohu/目錄下了,我們的javascript就可以盡情調用其RESTFUL服務了。

順便說一下,rewrite^.+sohu/?(.)$ /$1 break; 這句命令中,$1表示(.)這個部分。第一對()內的參數是$1,第二對()內的參數就是$2,以此類推。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Angular4如何開發解決跨域問題”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女