成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Angular通過CORS實現跨域方案

開發 前端
通篇寫完才發現有點掛羊頭賣狗肉的感覺,與其說Angular的跨域方案,不如說CORS的使用以及Angular中設置才對.靠譜的前端必備...尤其是遇到不靠譜的后端時.

以前有一篇很老的文章網上轉了很多,包括現在如果你百度"跨域"這個關鍵字,前幾個推薦的都是"Javascript跨域總結與解決方案".看了一下感覺手段有點陳舊了,有一些比如document.domain還有iframe的解決方案委實"丑陋"一些,感覺不再適用于現在一些項目中.

就拿iframe來說作為一個前端工程師,我極為討厭iframe這種東西.它不光增加了性能上的高負荷,同時也不利于掌控。

在Angular應用中實現跨域的方式相對簡單,基本上通過兩種方式即可.一種是JSONP,另一種是通過CORS.前者是相對比較老的手法,后者我感覺更加給力一點,所以本文主要說一下Angular如何與CORS配合跨域.

能不使用JSONP就盡量不使用,這是著手于Angular跨域的一個原則吧.不管怎么說,script的標簽嵌入感覺還是low了點.

Angular推崇的時前后端分離,所以跨域由哪一方實現成為一個問題.這個就不得不說前端技術上的局限性,即使是相對好用的JSONP對于非GET請求也是無能為力的,因為它本質上還是通過script去get一些資源.

JSONP這種只能GET的限制,在Angular推崇RESTful風格接口的API場景下,就完全制約了它的使用,總不能棄POST和PUT那些不管.并且JSONP的錯誤處理很弱,不盡人意.總之前端實現跨域都有各種各樣的局限性,又比如像document.domain則只能用于主域相同,子域不同的情況.

所以總結而言,雖然前端有多種方式處理跨域,但是多而不精,缺點都比較明顯.相對而言更好的方式是通過后端參與處理,這樣做不僅適用性更強,同時前端只要發送正常的Ajax請求即可.這樣的技術叫做CORS.

Cross-Origin Resource Sharing跨域資源共享,應該算是現在最為推薦的跨域處理方案.不僅適用于各種Method,而且更加方便和簡單.當然了,這么吊的東西只有現代瀏覽器支持,IE8一下的老古董就不要想了.

CORS實現原理

雖然通過CORS實現跨域基本上完全由后端實現,不過身為一個給力的前端.還是要掌握一下這一原理,以便當你遇到不靠譜的后端時,不至于...你懂得

CORS的本質讓服務器通過新增響應頭Access-Control-Allow-Origin,通過HTTP方式來實現資源共享,讓每個請求的服務直接返回資源.它使用了HTTP交互方式來確定請求源是否有資格請求該資源,并且通過設置HTTP Header來控制訪問資源的權限.

具體的過程是這樣的前端發送一個正常的請求:

  1. $http.get('www.cros.com/api/data',{params:{  
  2.   name: '頑Shi' 
  3. }}) 

后端設置一下response的header:

  1. Access-Control-Allow-Origin: "*" 
  2. Access-Control-Allow-Methods: "GET" 
  3. Access-Control-Max-Age: "60"   

然后你觀察一下瀏覽器的行為會發現有趣的事,瀏覽器在沒有你干預的情況下,發現這是一個跨域請求.所以它沒有直接發送GET請求,而是發送了一個OPTIONS請求詢問是否可以跨域訪問該資源,這個過程我們可以稱之為"預檢".

然后我們看到OPTIONS的response返回了類似下面的信息:

  1. HTTP/1.1 200 OK  
  2.  
  3.  
  4. Date: Mon, 01 Dec 2013 01:15:39 GMT  
  5. Server: Apache/2.0.61 (Unix)  
  6. Access-Control-Allow-Origin: *  
  7. Access-Control-Allow-Methods: GET  
  8. Access-Control-Max-Age: 60  
  9. Content-Encoding: gzip  
  10. Content-Length: 0  
  11. Connection: Keep-Alive  
  12. Content-Type: text/text  

這里的這幾個Access頭的內容就是服務器后端加上去的,它告訴了瀏覽器此后的60秒內,所有域都可以通過GET方法進行跨域訪問該資源.然后瀏覽器自動再次發送了真正的GET請求,并返回對應的結果.

注意這一過程是瀏覽器自動實現的,這一點是不是非常棒.一些header信息的設置如下:

  1. Access-Control-Allow-Origin: <origin> | * // 授權的源控制  
  2. Access-Control-Max-Age: <delta-seconds> // 授權的時間  
  3. Access-Control-Allow-Credentials: true | false // 控制是否開啟與Ajax的Cookie提交方式  
  4. Access-Control-Allow-Methods: <method>[, <method>]* // 允許請求的HTTP Method  
  5. Access-Control-Allow-Headers: <field-name>[, <field-name>]* // 控制哪些header能發送真正的請求     

這里還有一處需要前端工程師協作的地方就是cookie的傳遞,默認情況下通過CORS這樣的方式是不會傳遞cookie.一般強制性將cookie添加到header的做法,也會被瀏覽器拒絕并報錯.上面看到了在服務器端會通過添加一個response頭,Access-Control-Allow-Credentials來控制是否允許Cookie的提交.

在Angular中我們需要進行一些設置達到目的:

  1. $http.post(url, {withCredentials: true, ...})  
  2. // 或者  
  3. $http({withCredentials: true, ...}).post(...)  
  4. // 或者  
  5. .config(function ($httpProvider) {  
  6.   $httpProvider.defaults.withCredentials = true;  

如果是jQuery則要設置如下:

  1. $.ajax("www.cros.com/api/data", {  
  2.   type: "GET",  
  3.   xhrFields: {  
  4.     withCredentials: true 
  5.   },  
  6.   crossDomain: true,  
  7.   success: function(data, status, xhr) {  
  8.   }  
  9. }); 

CORS的過程描述完畢,在網上找到一張圖片:

 

CORS的分類

如果仔細觀察瀏覽器的行為會發現,并不是所有的跨域請求都會發送OPTIONS請求.是不是有些奇怪,這就涉及到CORS的分類,簡單請求和復雜請求.

HTTP的header通常包含下面這些內容:

  1. Accept  
  2. Accept-Language  
  3. Content-Language  
  4. Last-Event-ID  
  5. Content-Type的值僅是下列之一:  
  6.                      application/x-www-form-urlencoded  
  7.                      multipart/form-data  
  8.                      text/plain 

HTTP方法是HEAD,GET,POST之一,同時HTTP的header包含如上面所示.任何一個不滿足這兩種要求的請求,都是復雜請求.比如發送PUT,DELETE等HTTP動作,或者Content-Type: application/json的內容.

只有復雜請求包含"預檢"這一動作,另外Access-Control-Max-Age應該也會影響OPTIONS請求的發送.

原文鏈接:http://my.oschina.net/blogshi/blog/303758

責任編輯:林師授 來源: 頑Shi的博客
相關推薦

2021-06-25 09:04:39

Cors跨域JSONP vs CO

2021-06-15 07:32:59

Cookie和Sess實現跨域

2019-04-10 10:32:16

CORSNginx反向代理

2022-04-29 09:11:14

CORS瀏覽器

2021-06-10 18:11:02

Cors跨域Web開發Cors

2023-12-20 14:42:59

2020-08-31 19:20:33

瀏覽器CORS跨域

2013-11-27 10:23:23

2021-06-17 07:15:36

Cors跨域多域名

2019-03-13 14:15:25

CORS跨域資源前端

2024-05-20 09:28:44

Spring客戶端瀏覽器

2020-08-13 07:04:45

跨域CORS瀏覽器

2023-11-20 08:02:49

2024-01-31 07:55:52

2018-01-26 08:39:03

2018-12-12 15:50:13

2023-05-06 15:32:04

2019-11-11 17:34:16

前端開發技術

2024-12-02 14:30:20

2022-03-21 07:35:34

處理方式跨域
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美三级免费观看 | 国产精品成人在线播放 | 久久精品视频亚洲 | 欧美精品在线一区 | 国产精品a一区二区三区网址 | 国产精品福利网站 | 中文二区 | 狠狠的干| 国产亚洲精品久久久久久牛牛 | 91久久国产综合久久 | 欧美不卡一区二区 | 麻豆国产一区二区三区四区 | 国产黑丝在线 | 欧美精品久久久久 | 99国产精品久久久久老师 | 男女国产视频 | 成人亚洲视频 | 亚洲精品久| 欧美 日韩 国产 成人 | 在线观看亚| 91久久精品一区二区二区 | 中文字幕av第一页 | 欧美视频在线播放 | 亚洲国产欧美在线 | 精品伊人| 九九九久久国产免费 | 一区视频在线免费观看 | 国产精品久久久久久久久久久久久 | 亚洲欧美日韩精品久久亚洲区 | 国产在线播 | 国产精品久久久久久一区二区三区 | 黄色一级片aaa | 精品视频在线观看 | 久久99精品久久久久久国产越南 | 欧美日韩综合 | 国产一区二区免费在线 | 久久精品a| 在线一区视频 | 自拍偷拍亚洲一区 | 亚洲逼院 | 日本精品999|