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

用 Node.js 處理 CORS

開發 前端
在本文中,我們將研究怎樣用 Express 配置 CORS 以及根據需要定制 CORS 中間件。

在本文中,我們將研究怎樣用 Express 配置 CORS 以及根據需要定制 CORS 中間件。

什么是CORS

CORS 是“跨域資源共享”的簡寫。它是一種允許或限制向 Web 服務器上請求資源的機制,具體取決于進行 HTTP 請求的位置。

這種策略用于保護特定 Web 服務器免受其他網站或域的訪問。只有允許的域才能訪問服務器中的文件,例如樣式表、圖像或腳本等。

假設你當前使用的是 http://example.com/page1,并且你引用的是來自 http://image.com/myimage.jpg 的圖片,那么除非 http://image.com 允許與 http://example.com 進行跨域共享,否則將無法獲取該圖像。

每個 HTTP 請求頭中都有一個名為 origin 的頭。它定義了域請求的來源。可以用這個頭的信息來限制引用你服務器上的資源。

默認來自任何其他來源的請求都會受到瀏覽器的限制。

例如當開發時如果用的是 React 或 Vue 這類的前端庫,則前端應用將運行在 http://localhost:3000 上,同時,你的 Express 服務器可能正在其他端口上運行,例如 http://localhost:2020。這時就需要在這些服務器之間允許 CORS。

如果你在瀏覽器控制臺中看到下圖這類的錯誤。問題可能出在 CORS 限制上:

chrome cors

如果我們需要提供公共 API 并希望控制對某些資源的訪問和使用方式時,CORS 能夠發揮很大的作用。

另外,如果想在其他網頁上使用自己的 API 或文件,也可以簡單地將 CORS 配置為允許自己引用,同時把其他人拒之門外。

用 Express 配置 CORS

首先創建一個新的項目,并創建目錄結構,然后使用默認設置運行 npm init:

  1. $ mkdir myapp 
  2. $ cd myapp 
  3. $ npm init -y 

接下來安裝所需的模塊。我們將使用 express 和 cors 中間件:

  1. $ npm i --save express 
  2. $ npm i --save cors 

然后,開始創建一個簡單的有兩個路由的 Web 程序,用來演示 CORS 的工作原理。

首先創建一個名為 index.js 的文件,用來充當 Web 服務器,并實現幾個請求處理函數:

  1. const express = require('express'); 
  2. const cors = require('cors'); 
  3.  
  4. const app = express(); 
  5.  
  6. app.get('/', (req, res) => { 
  7.     res.json({ 
  8.         message: 'Hello World' 
  9.     }); 
  10. }); 
  11.  
  12. app.get('/:name', (req, res) => { 
  13.     let name = req.params.name; 
  14.  
  15.     res.json({ 
  16.         message: `Hello ${name}` 
  17.     }); 
  18. }); 
  19.  
  20. app.listen(2020, () => { 
  21.     console.log('server is listening on port 2020'); 
  22. }); 

運行服務器:

  1. $ node index.js 

訪問 http://localhost:2020/ 服務器應該返回 JSON 消息:

  1.   "message": "Hello World" 

訪問 http://localhost:2020/something 應該能夠看到:

  1.   "message": "Hello something" 

啟用所有CORS請求

如果想為所有的請求啟用 CORS,可以在配置路由之前簡單地使用 cors 中間件:

  1. const express = require('express'); 
  2. const cors = require('cors'); 
  3.  
  4. const app = express(); 
  5.  
  6. app.use(cors()) 
  7.  
  8. ...... 

如果需要,這會允許在網絡上的任何位置訪問所有路由。所以在本例中,每個域都可以訪問兩條路由。

例如,如果我們的服務器在 http://www.example.com 上運行并提供諸如圖片之類的內容,則我們允許 http://www.differentdomain.com 之類的其他域從 http://www.example.com 進行引。

因此 http://www.differentdomain.com 上的網頁可以將我們的域用作圖像的來源:

  1. <img src="http://www.example.com/img/cat.jpg"> 

為單個路由啟用 CORS

如果只需要其中某一個路由,可以在某個路由中將 cors 配置為中間件:

  1. app.get('/', cors(), (req, res) => { 
  2.     res.json({ 
  3.         message: 'Hello World' 
  4.     }); 
  5. }); 

這會允許任何域訪問特定的路由。在當前的情況下,其他域都只能訪問 / 路由。僅在與 API(在本例中為http://localhost:2020)的相同域中發起的請求才能訪問 /:name 路由。

如果嘗試另一個來源發送請求到 / 路徑將會成功,并且會收到 Hello World 作為響應:

  1. fetch('http://localhost:2020/') 
  2.     .then(response => response.json()) 
  3.     .then(data => console.log(data)) 
  4.     .catch(err => console.error(err)); 

運行上面的代碼,會看到來自服務器的響應已成功輸出到控制臺:

  1.     message: 'Hello World' 

如果訪問除根路徑以外的其他路徑,例如 http://localhost:2020/name 或 http://localhost:2020/img/cat.png,則此請求將會被瀏覽器阻止:

  1. fetch('http://localhost:2020/name/janith') 
  2.   .then(response => response.json()) 
  3.   .then(data => console.log(data)) 
  4.   .catch(err => console.error(err)); 

如果在其他 Web 應用中運行代碼,應該看到以下錯誤:

控制臺錯誤

1. 用選項配置CORS

還可以用自定義選項來配置 CORS。可以根據需要配置允許的 HTTP 方法,例如 GET 和 POST。

下面是通過 CORS 選項允許單個域訪問的方法:

  1. var corsOptions = { 
  2.     origin: 'http://localhost:8080', 
  3.     optionsSuccessStatus: 200 // For legacy browser support 
  4.  
  5. app.use(cors(corsOptions)); 

如果你在源中配置域名-服務器將允許來自已配置域的CORS。因此,在我們的例子中,可以從 http://localhost:8080 訪問該API,并禁止其他域使用。

如果發送一個 GET 請求,則任何路徑都應該可以訪問,因為這些選項是在應用在程序級別上的。

運行下面的代碼將請求從 http://localhost:8080 發送到 http://localhost:2020:

  1. // 
  2. fetch('http://localhost:2020/') 
  3.   .then(response => response.json()) 
  4.   .then(data => console.log(data)) 
  5.   .catch(err => console.error(err)); 
  6.  
  7. // 
  8. fetch('http://localhost:2020/name/janith') 
  9.   .then(response => response.json()) 
  10.   .then(data => console.log(data)) 
  11.   .catch(err => console.error(err)); 

可以看到被允許從該程序和域中獲取信息。

還可以根據需要配置允許的 HTTP 方法:

  1. var corsOptions = { 
  2.     origin: 'http://localhost:8080', 
  3.     optionsSuccessStatus: 200 // 對于舊版瀏覽器的支持 
  4.     methods: "GET, PUT" 
  5.  
  6. app.use(cors(corsOptions)); 

如果從 http://localhost:8080 發送POST請求,則瀏覽器將會阻止它,因為僅支持 GET 和 PUT:

  1. fetch('http://localhost:2020', { 
  2.   method: 'POST', 
  3.   body: JSON.stringify({name: "janith"}), 
  4. }) 
  5. .then(response => response.json()) 
  6. .then(data => console.log(data)) 
  7. .catch(err => console.error(err)); 

用函數配置動態 CORS 源

如果配置不滿足你的要求,也可以創建函數來定制 CORS。

例如假設要允許 http://something.com 和 http://example.com 對 .jpg 文件進行CORS共享:

  1. const allowlist = ['http://something.com', 'http://example.com']; 
  2.  
  3.     const corsOptionsDelegate = (req, callback) => { 
  4.     let corsOptions; 
  5.  
  6.     let isDomainAllowed = whitelist.indexOf(req.header('Origin')) !== -1; 
  7.     let isExtensionAllowed = req.path.endsWith('.jpg'); 
  8.  
  9.     if (isDomainAllowed && isExtensionAllowed) { 
  10.         // 為此請求啟用 CORS 
  11.         corsOptions = { origin: true } 
  12.     } else { 
  13.         // 為此請求禁用 CORS 
  14.         corsOptions = { origin: false } 
  15.     } 
  16.     callback(null, corsOptions) 
  17.  
  18. app.use(cors(corsOptionsDelegate)); 

回調函數接受兩個參數,第一個是傳遞 null 的錯誤,第二個是傳遞 { origin: false } 的選項。第二個參數可以是用 Express 的 request 對象構造的更多選項。

所以 http://something.com 或 http://example.com 上的 Web 應用將能夠按照自定義配置從服務器引用擴展名為 .jpg 的圖片。

這樣可以成功引用資源文件:

  1. <img src="http://yourdomain.com/img/cat.jpg"> 

但是下面的文件將會被阻止:

  1. <img src="http://yourdomain.com/img/cat.png"> 

從數據源加載允許的來源列表作

還可以用保存在數據庫中的白名單列表或任何一種數據源來允許 CORS:

  1. var corsOptions = { 
  2.     origin: function (origin, callback) { 
  3.         // 從數據庫加載允許的來源列表 
  4.         // 例如:origins = ['http://example.com', 'http//something.com'] 
  5.         database.loadOrigins((error, origins) => { 
  6.             callback(error, origins); 
  7.         }); 
  8.     } 
  9.  
  10. app.use(cors(corsOptions)); 

 

責任編輯:趙寧寧 來源: 前端先鋒
相關推薦

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2012-02-02 15:14:29

Node.js

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2023-10-04 07:35:03

2011-09-08 13:46:14

node.js

2011-11-01 10:30:36

Node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2014-07-11 14:16:15

AbsurdJSExpress

2011-11-10 08:55:00

Node.js

2012-10-24 14:56:30

IBMdw

2021-06-02 00:29:08

Node.jsAcceptEmfile

2021-12-13 11:21:46

NodePython開發

2020-05-29 15:33:28

Node.js框架JavaScript

2015-06-23 15:27:53

HproseNode.js

2012-02-03 09:25:39

Node.js

2021-04-06 10:15:29

Node.jsHooks前端

2024-07-08 08:53:52

2021-02-01 15:42:45

Node.jsSQL應用程序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91麻豆精品国产91久久久久久久久 | 亚洲欧美日本在线 | 久久久蜜臀国产一区二区 | 久久网国产 | 一区二区三区精品视频 | 99精品免费久久久久久久久日本 | 九九视频在线观看视频6 | 免费一级大片 | 久久久久久www | 最新中文字幕在线 | 亚洲一区国产 | 国产一区二区三区久久久久久久久 | 在线国产视频 | 久久久久久久久久影视 | 在线91| 精品久久久精品 | 精品国产欧美日韩不卡在线观看 | 美国a级毛片免费视频 | 国产一区二区三区四区三区四 | 精品国产91亚洲一区二区三区www | 99精品九九| 激情一区二区三区 | 国产综合久久久久久鬼色 | 欧美福利视频 | 日韩欧美精品在线 | 国产精品高潮呻吟久久aⅴ码 | 精品久久久久久亚洲国产800 | 毛片99 | 日韩有码在线播放 | 一区二区免费看 | 精品一区二区三区四区五区 | 日韩免费av | 国产精品日韩欧美一区二区三区 | 欧美一级免费看 | 一区二区av | 国产在线a| 琪琪午夜伦伦电影福利片 | 亚州综合一区 | a免费观看 | 国产在线看片 | 久久久www |