精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

跨域是個什么鬼,你搞明白了嗎?

網絡 通信技術
跨域是個老生常談的話題了,最近不管在和后端聯調,或者搞微前端的時候都會遇到,正好寫篇文章來總結一下吧。

[[433686]]

跨域是個老生常談的話題了,最近不管在和后端聯調,或者搞微前端的時候都會遇到,正好寫篇文章來總結一下吧。

跨域是什么

這里的“跨域”指的是不同源之間的資源訪問。只要請求的 url 有以下不同,都屬于“跨域”:

  • 協議: http, https, ...
  • 域名
  • 端口

有人可能會覺得,我自己網站肯定只訪問自己服務器,肯定都是部署在一個域名的呀。

但是有的時候,一個網頁可能要對接后端多個服務:一會對接支付,一會對接用戶信息。每個組的后端可能都會有自己的域名。在這樣的場景下,跨域就非常常見了。

為什么會有跨域

我們常說的“跨域”問題,其實是在說“跨域”訪問的限制問題,相信大家對下面的報錯習以為常了:

這種“跨域”限制其實是 瀏覽器自帶的安全機制,只有 在瀏覽器上 發生跨域請求操作時,瀏覽器就會自動拋出上面的錯誤。

注意,這僅在瀏覽器上會出現這樣的限制,如果你用 Postman 這些工具訪問 url 是沒有“跨域”限制的,畢竟 Postman 連域名這些玩意都沒有,哪來的“跨域”。

CORS

雖然瀏覽器出于安全考慮做了“跨域”訪問的限制,但開發時不可避免會有這樣不同源資源訪問的需求,因此 W3C 就制定了 CORS(Cross-origin resource sharing 跨域資源共享) 的機制。

很多人一直以為 CORS = 跨域,其實 CORS 是一種解決“跨域”的方案。

需要注意的是,CORS 是一個“新”的協議(至少對于以前的 IE7 是新的),不僅需要瀏覽器支持,也后端服務器的支持。

瀏覽器支持沒什么好說的,就是瀏覽器版本是否支持的問題:

然后就是后端服務器支持了,服務器需要在 Response Header 上添加 Access-Control-xxx-yyy 的字段,瀏覽器識別到了,才能放行該請求。比如,最常見的就是加 Access-Control-Allow-Origin 這個返回頭,值設置為需要放行的域名。

簡單請求 VS 非簡單請求

瀏覽器將 CORS 請求分為 簡單請求 和 非簡單請求。

簡單請求 會在發送時自動在 HTTP 請求頭加上 Origin 字段,來標明當前是哪個源(協議+域名+端口),服務端來決定是否放行。

非簡單請求 則會先發一個 OPTIONS 預檢請求給服務端,當通過了再發正常的 CORS 請求。

對于 簡單請求,請求方法為以下三種之一:

  • Head
  • Post
  • Get

且 HTTP 請求頭字段不能超過以下字段:

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type

同時 Content-Type 只能三個值:

  • application/x-www-form-urlencoded 對應普通表單
  • multipart/form-data 對應文件上傳
  • text/plain 對應文本發送(一般不怎么用)

只要不滿足上面條件的,都屬于 非簡單請求。

可能很多人會自然地覺得 POST 請求都是 非簡單請求,因為我們常看到發 POST 時,都會先發 OPTIONS。其實是因為我們一般都會傳 JSON 格式的數據,Content-Type 為 application/json,所以,這樣的 POST 請求才屬于 非簡單請求。

Access-Control-xxx-yyyy

當 CORS 請求為 簡單請求時,請求會檢測返回頭里的以下字段:

  • Access-Control-Allow-Origin:指定哪些源是可以共享資源的(包含協議、域名、端口)。
  • Access-Control-Allow-Credentials:當請求需要攜帶 Cookie 時,需要加上這個字段為 true 才能允許攜帶 Cookie。
  • Access-Control-Expose-Headers:由于 XMLHttpRequest 對象只能拿到 Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma 這 6 個基本字段。想要在拿到別的字段,就需要在這里去指定。

而當 CORS 請求為 非簡單請求時,瀏覽器會先發一個 OPTIONS 預檢(preflight)請求,這個請求會檢查如下字段:

  • Access-Control-Request-Method:指定可訪問的方法,對于非簡單請求,可能會用到 PUT,PATCH,DELETE 等 RESTful 方法,服務端需要把這些方法名也加上。
  • Access-Control-Request-Headers:指定 HTTP 請求頭會額外添加的信息。一個很常見的場景就是,后端有時候會將一些環境參數放到請求頭里,如果不用這個字段來指定放行的字段,那么就會出現“跨域”限制了。

如果 OPTIONS 請求沒有通過服務端的校驗,就會返回一個正常的 HTTP 請求,不會帶上 CORS 的返回信息,所以瀏覽器就會認定為“跨域”了。

總結一句話就是,當 Console 報哪個錯,你就在服務端返回頭上加上哪個字段就可以了。

CORS 中間件

無論對于 Express 還是 KOA,我們都不需要再手動添加上面的字段了,直接加一個 cors 中間件就可以很方便地添加上面的字段,寫起來也更優雅:

  1. var cors = require('cors'); 
  2.  
  3. var corsOptions = { 
  4.   origin: function (origin, callback) { 
  5.     // db.loadOrigins is an example call to load 
  6.     // a list of origins from a backing database 
  7.     db.loadOrigins(function (error, origins) { 
  8.       callback(error, origins) 
  9.     }) 
  10.   } 
  11.  
  12. app.use('/', cors(corsOptions), indexRouter); 

JSONP

那對于瀏覽器不支持 CORS 的情況呢?雖然目前來看是不太可能,但是在還沒有 CORS 的時代,大家是怎么解決跨域的呢?答案就是 JSONP。

它的原理也非常簡單:雖然瀏覽器限制了 HTTP 的跨域,但是沒有限制獲取 script 標簽內容的跨域請求呀。

 

當我們插入一個 <script src="xxx.com"> 標簽的時候,會發一個獲取 xxx.com 的 GET 請求,而這個 GET 請求又不存在“跨域”限制,通過這樣的方法就能解決跨域的問題了。

服務端實現:

  1. router.get('/', (req, res) =>  { 
  2.   const { callback_name } = req.query; 
  3.   res.send(`${callback_name}('hello')`) // 返回 JS 代碼,調用 callback_name 這個函數,并傳入 hello 
  4. }); 

前端實現:

  1. function jsonpCallback(params) { 
  2.   alert('執行 public/index.html 里定義的 jsonpCallback 函數,并傳入' + params + '參數'); 
  3.  
  4.  
  5. const jsonp = async () => { 
  6.   // 制作 script 標簽 
  7.   const script = document.createElement('script'); 
  8.   script.type = 'text/javascript'
  9.   script.src = 'http://localhost:9000/user?callback_name=jsonpCallback' 
  10.   // 添加標簽 
  11.   document.body.appendChild(script); 
  12.   // 拿到數據再移除 
  13.   document.body.removeChild(script); 
  14.  
  15. jsonp(); 

當調用 jsonp 函數的時候,自動創建一個 script 標簽,再把請求放到 scr 里,就會自動發起 GET 請求。服務端會直接返回一串 JavaScript 代碼,然后前端執行這段從服務端獲取來的 JS 代碼,獲取到后端數據。

跨域場景

“跨域”不僅存在于接口訪問,還會有以下場景:

  • 前端訪問跨域 URL,最常見的場景,需要后端添加 cors 的返回字段
  • 微前端:主應用和子應用之間的資源訪問可能存在“跨域”操作,需要子應用/主應用添加 cors
  • 登錄重定向:本質上和第一條一樣,不過在現象層面不太一樣。比如訪問 abc.com 時,有的網站會重定向到自己的登錄頁 passport.abc.com,如果 passport.abc.com 沒有設置 cors,也會出現跨域

總結

總的來說,我們常說的“跨域”,其實就是獲取不同源(協議+域名+端口)的資源時,瀏覽器自身 做出的限制。

在以前,開發者會用 JSONP 這種通過生成一個 script 標簽,自動發起 GET 請求的方式來解決跨域,但是這種方式非常不安全,不推薦。

到了現在,瀏覽器都已經完美支持 CORS 機制了,只需要在服務端添加對應的返回頭 Access-Control-xxx-yyy 就可以了。當瀏覽器報“跨域”錯誤時,缺哪個字段,就在服務端配哪個字段即可。

Node 端開發時,我們可以直接使用 cors 中間件來配置,就不用手寫返回頭里的字段了。

 

責任編輯:武曉燕 來源: 寫代碼的海怪
相關推薦

2022-12-30 08:35:00

2024-05-30 08:19:52

微服務架構大型應用

2022-05-04 08:38:32

Netty網絡框架

2015-05-21 15:45:13

2015-09-18 09:17:06

數據分析

2023-08-26 21:42:08

零拷貝I/O操作

2023-07-27 08:26:36

零拷貝I/O操作

2022-09-27 07:31:57

Property模式數據

2017-06-14 11:18:40

2022-10-10 18:38:56

inert屬性鍵盤

2023-12-08 08:38:15

EventLoopAPI瀏覽器

2022-04-07 11:15:22

PulseEventAPI函數

2023-12-28 08:43:28

前端算法搜索

2022-10-19 08:19:32

動態基線預警

2024-01-08 20:05:32

2018-04-03 14:49:24

2023-06-14 08:15:34

算法合并操作Winner

2023-12-06 08:01:03

CSSPostCSS

2024-03-27 13:33:00

MySQLInnoDB事務

2022-10-24 20:25:40

云原生SpringJava
點贊
收藏

51CTO技術棧公眾號

成人精品久久久| 日韩视频欧美视频| 成年人小视频网站| 欧美被日视频| 高清不卡一区二区在线| 国产www精品| 91精品国产高清一区二区三蜜臀| 精品国产乱子伦一区二区| 在线影视一区二区三区| 日韩精品一区二区三区电影| 涩爱av在线播放一区二区| 久久国产综合精品| 91成人天堂久久成人| 国产又大又粗又爽的毛片| 欧美日本三级| 欧美午夜理伦三级在线观看| 无码 制服 丝袜 国产 另类| 免费**毛片在线| 久久亚洲综合av| 国产精品一区在线播放| 国产精品久久久久久久成人午夜| 亚洲视频成人| 欧美国产一区二区三区| 手机看片国产日韩| 天堂成人娱乐在线视频免费播放网站| 9191精品国产综合久久久久久| 亚洲午夜无码av毛片久久| 亚洲91av| 91综合视频| 日韩高清免费观看| 精品人妻二区中文字幕| 久久夜夜久久| 日本国产一区二区| 六月婷婷在线视频| av在线免费网站| 国产精品久久久久影院亚瑟| 欧美人xxxxx| 三级在线观看网站| 成人动漫一区二区| 国产精品视频免费一区二区三区| 国产伦理一区二区| 亚洲欧美一级二级三级| 最新国产精品亚洲| 日本不卡一区二区在线观看| 小视频免费在线观看| 一区二区三区成人| 日本道在线视频| 黄色网页在线免费看| 国产精品视频yy9299一区| 欧美日韩精品久久| 国产最新视频在线| 国产日韩影视精品| 国产精品日韩在线播放| 免费无码国产精品| 午夜久久免费观看| 色噜噜狠狠狠综合曰曰曰88av| 中文字幕第20页| 国产精品一区二区av交换| 亚洲区一区二区| 精品人妻一区二区三区四区| 欧美特黄一级大片| 色悠悠国产精品| 午夜精品一区二区三级视频| 1024精品久久久久久久久| 日韩一中文字幕| 卡通动漫亚洲综合| 欧美人成在线| 久久久久国色av免费观看性色| 国产亚洲精品成人| 久久91成人| 亚洲一区二区精品| 战狼4完整免费观看在线播放版| 日韩理论电影院| 精品国产欧美成人夜夜嗨| 久久99久久99精品免费看小说| 欧美一区二区三区久久精品茉莉花| 久久99精品久久久久久琪琪| 精品在线视频观看| 亚洲欧美日韩综合国产aⅴ| 国产精品精品视频| a级片免费观看| 99精品国产热久久91蜜凸| 欧美中日韩免费视频| 瑟瑟视频在线| 亚洲成人免费观看| 亚洲视频欧美在线| 97影院秋霞午夜在线观看| 亚洲国产成人av| 无遮挡又爽又刺激的视频| 国产成+人+综合+亚洲欧美| 337p亚洲精品色噜噜狠狠| 99免费观看视频| 精品久久久中文字幕| 欧美精品在线免费| 最近免费中文字幕大全免费版视频| 六月婷婷色综合| 国产伦精品一区二区三区照片| 黄色av网站在线免费观看| 日韩一区欧美小说| 日韩a在线播放| 亚洲开心激情| 这里只有精品视频| 日本熟妇成熟毛茸茸| 亚洲激情中文在线| 欧美亚洲激情视频| 国产一区二区三区中文字幕| aaa欧美日韩| 国产麻豆乱码精品一区二区三区| 人人九九精品| 一区二区三区四区高清精品免费观看| 亚洲熟妇av一区二区三区| 亚洲国产91视频| 日韩久久午夜影院| 欧美日韩免费做爰视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品美女黄网| 精品176二区| 色香蕉久久蜜桃| 星空大象在线观看免费播放| 一区二区在线| 国产日韩欧美视频在线| 色视频免费在线观看| 亚洲一区二区三区视频在线播放| 不卡的av中文字幕| 你微笑时很美电视剧整集高清不卡| 色综合色综合网色综合| 国产精品久久免费| 国产欧美一区二区三区鸳鸯浴| 国产中文字幕在线免费观看| 国产精品迅雷| 亚洲第一级黄色片| 欧美高清性xxxx| 在线播放不卡| 国产精品夜夜夜一区二区三区尤| 国内外激情在线| 在线电影院国产精品| 山东少妇露脸刺激对白在线| 久久亚洲图片| 涩涩涩999| 日韩大尺度黄色| 亚洲欧美国产精品久久久久久久| www.日本精品| 久久综合久久鬼色中文字| 日本国产在线播放| 欧美精品高清| 亚洲欧美综合另类中字| 中文字幕第15页| 2023国产精品自拍| 成人小视频在线看| 国产欧美日韩免费观看| 国产精品久久久久久久久借妻| 九九在线视频| 欧美伊人久久久久久久久影院| a天堂中文字幕| 青草国产精品久久久久久| 日日骚一区二区网站| 电影一区二区| 久久九九免费视频| 国产成人毛毛毛片| 亚洲午夜久久久久久久久久久| zjzjzjzjzj亚洲女人| 精品91在线| 久久综合色一本| 成人日韩在线观看| 中文字幕亚洲欧美在线 | 亚洲主播在线观看| 精品少妇人妻av一区二区三区| 99精品视频免费观看视频| 欧美日韩在线观看一区| 国产成人免费9x9x人网站视频| 日韩中文字幕在线免费观看| 国产理论片在线观看| 亚洲综合丝袜美腿| 真人bbbbbbbbb毛片| 免费在线观看日韩欧美| 黄色特一级视频| 伊人久久大香线蕉av不卡| 国产在线视频2019最新视频| 欧美1—12sexvideos| 亚洲欧美综合另类中字| 国产美女免费看| 亚洲一级电影视频| 国产sm调教视频| 国产精品1区2区3区在线观看| 欧美变态另类刺激| 久久香蕉国产| 国产在线视频欧美一区二区三区| 欧美在线va视频| 免费不卡欧美自拍视频| 亚洲欧洲综合在线| 欧美日韩二区三区| 色网站在线播放| 国产福利91精品一区二区三区| cao在线观看| 日韩系列欧美系列| 精品婷婷色一区二区三区蜜桃| 97精品国产综合久久久动漫日韩 | 天天爽天天狠久久久| 久久三级中文| 国产suv精品一区二区| 污污片在线免费视频| 亚洲视频第一页| 亚洲国产精品18久久久久久| 色哟哟日韩精品| 久久免费公开视频| 国产精品高潮呻吟久久| www.自拍偷拍| 成人一道本在线| 亚洲欧美天堂在线| 日本成人在线一区| 久久久一本二本三本| 在线观看国产精品入口| 视频一区二区三区免费观看| 九色丨蝌蚪丨成人| 91久久偷偷做嫩草影院| 久久69成人| 性色av香蕉一区二区| 污污网站在线看| 久久中文久久字幕| 69xxxx欧美| 国产一区二区三区在线观看视频| 色欲久久久天天天综合网| 欧美一区二区女人| 欧美日韩大片在线观看| 欧美韩日一区二区三区四区| 无码人妻aⅴ一区二区三区| 国产福利一区二区三区视频在线| 国产一伦一伦一伦| 日韩国产精品大片| 白嫩少妇丰满一区二区| 亚洲一区免费| 欧美色图色综合| 亚洲高清成人| 成人午夜视频在线观看免费| 欧美三级视频| a级黄色片免费| 日本精品一区二区三区在线观看视频| 国产成人精品一区二区三区| av日韩亚洲| 日韩美女视频中文字幕| 日本黄色免费在线| 韩国视频理论视频久久| 成人黄色动漫| 91产国在线观看动作片喷水| 中文不卡1区2区3区| 欧美夜福利tv在线| 中文字幕资源网在线观看免费| 91成品人片a无限观看| 欧亚av在线| 日韩av色在线| 草民电影神马电影一区二区| 国产精品一区二区三区久久久| 热久久久久久| 91精品视频在线免费观看| 国产亚洲字幕| 国产91视觉| 久久资源综合| 日本不卡在线播放| 日韩精品看片| www.69av| 国产一区二区你懂的| 日韩亚洲在线视频| 免费成人av资源网| 宇都宫紫苑在线播放| 成人黄色av网站在线| 国产精品jizz| 中文字幕一区二区三区不卡| 18岁成人毛片| 欧美日韩中文字幕日韩欧美| 中文字幕免费播放| 日韩午夜在线观看| 亚洲高清视频免费观看| 欧美日韩亚洲综合一区| 国产wwwxxx| 亚洲精品久久久久国产| 国产三级在线| 亚洲国产精品久久精品怡红院| 深夜福利视频一区| x99av成人免费| 丁香花电影在线观看完整版| 久久精品国产成人| 国产区美女在线| 国产精品久久久| 欧美视频三区| 欧美性xxxx69| 欧美色123| 最新中文字幕免费视频| 国产成人福利片| 少妇愉情理伦三级| 亚洲成人免费观看| 一卡二卡三卡在线观看| 日韩精品一区二区久久| 久久精品国产美女| 91蜜臀精品国产自偷在线 | 国产黄大片在线观看画质优化| 国内精品视频在线| 粉嫩av一区二区三区四区五区 | 国产网站无遮挡| 中文字幕一区二区三区精华液| 九九热在线视频播放| 91精品国产美女浴室洗澡无遮挡| 四虎精品成人免费网站| 欧美电影精品一区二区| 黄网在线观看| 久久久久久久久久久网站| 成人国产一区| 久久久久资源| 激情成人综合| 天堂av.com| 国产精品另类一区| 成人午夜视频在线播放| 欧美成人精品福利| 永久免费av在线| 国产成人精品国内自产拍免费看| jizz性欧美23| 强开小嫩苞一区二区三区网站| 偷偷www综合久久久久久久| 男人揉女人奶房视频60分 | 国产福利久久精品| 久久麻豆精品| jizz欧美激情18| 日韩影院精彩在线| 手机在线成人av| 亚洲国产日韩一区二区| 国产av无码专区亚洲a∨毛片| 在线观看国产成人av片| 久久电影tv| 久久久久免费网| av成人激情| 亚洲欧美日本一区| 亚洲成人在线网站| www.五月婷婷| 欧美日韩国产999| 试看120秒一区二区三区| 警花观音坐莲激情销魂小说| 精品无人码麻豆乱码1区2区| 天海翼在线视频| 正在播放亚洲一区| 高清免费电影在线观看| 成人妇女免费播放久久久| 日韩精品一卡| 男女污污视频网站| 一区二区三区精品在线| 精品国产av 无码一区二区三区| 久色乳综合思思在线视频| 国产亚洲久久| 国产真实老熟女无套内射| 成人97人人超碰人人99| 日本一级一片免费视频| 亚洲激情免费观看| 欧美成人ⅴideosxxxxx| 台湾成人av| 激情文学综合丁香| 精品欧美一区二区久久久久| 日韩欧美一区二区不卡| 久久久123| 精品一区二区日本| 玖玖精品视频| 国产免费嫩草影院| 欧美一区欧美二区| 国产嫩草在线视频| 欧美日韩国产一二| 六月丁香婷婷久久| 久久99久久久| 亚洲精品视频播放| 国内精品伊人| 在线观看17c| 91免费视频网址| 亚洲一区二区色| 日韩av在线一区二区| 波多视频一区| 亚洲制服中文| 成人深夜在线观看| 国产熟妇一区二区三区四区| 日韩视频永久免费观看| 岛国精品一区| 手机在线看福利| 樱花影视一区二区| 巨骚激情综合| 91亚洲va在线va天堂va国 | 黄色成人免费看| 中文字幕五月欧美| 风流老熟女一区二区三区| 日韩美女av在线免费观看| 亚洲一区二区三区| 三叶草欧洲码在线| 91精品国产一区二区| 精品捆绑调教一区二区三区| 亚洲欧美日韩不卡一区二区三区| 国产一区在线观看麻豆| 日韩av片在线免费观看| 日韩免费在线观看| 亚洲成av在线| 男人天堂av片| 国产精品久久久久影院色老大| 人妻夜夜爽天天爽| 成人国产精品日本在线| 亚洲综合不卡| 久久久精品一区二区涩爱| 国产亚洲激情在线|