淺談CORS

来源:https://www.cnblogs.com/karthuslorin/archive/2018/09/09/9615681.html
-Advertisement-
Play Games

淺談CORS CORS全稱“跨站資源共用”(Cross Origin Resource Sharing),它允許瀏覽器剋服瀏覽器同源策略向跨域伺服器發出請求。 同源策略 概念 說到CORS,那麼就不得不提瀏覽器同源策略,所謂“同源”,是指伺服器URL的三個相同: 1.協議相同 2.功能變數名稱相同 3.埠 ...


淺談CORS

CORS全稱“跨站資源共用”(Cross-Origin Resource Sharing),它允許瀏覽器剋服瀏覽器同源策略向跨域伺服器發出請求。

同源策略

概念

說到CORS,那麼就不得不提瀏覽器同源策略,所謂“同源”,是指伺服器URL的三個相同:

1.協議相同

2.功能變數名稱相同

3.埠相同

舉個慄子:比如一個URL是http://www.example.com:80/a.html,那麼:

http://www.example.com:80/b.html    // 同源
https://www.example.com:80/a.html   // 非同源(協議不同)
http://www.example1.com:80/a.html   // 非同源(功能變數名稱不同)
http://www.example.com:81/a.html    // 非同源(埠不同)

限制

如果非同源,那麼三種行為將受到限制:

1.非同源頁面無法跨域讀取瀏覽器本地數據存儲(Cookie、LocalStorage和IndexDB)

2.非同源頁面無法跨域獲取DOM

3.非同源頁面無法跨域發送AJAX請求

目的

那麼,為什麼瀏覽器要使用同源策略?

同源策略的目的,是為了保證用戶的信息安全,防止被不法分子竊取數據。而眾所周知,Cookie包含大量的登錄信息,如果一個網頁可以跨域訪問另一個網站的Cookie,那麼不法分子可以通過使用跨域訪問獲取Cookie然後冒充用戶,為所欲為。

由此可見,同源策略是極其有必要的。

突破同源策略

但是,很多時候,我們需要跨域發送AJAX請求,此時我們就需要突破同源策略不允許發送跨域AJAX的規定。隨著技術的發展,有很多技術可以實現跨域發送AJAX請求,常見的有以下三種:

1.JSONP

2.Websocket

3.CORS

JSONP

JSONP是CORS技術出來之前最常用的跨域解決方案,最大的特定是相容性好,簡單,不需要進行大的伺服器改動。它的基本思路是通過動態添加一個script標簽,向伺服器請求腳本,腳本中一般調用一個客戶端定義的函數,將數據作為參數,調用客戶端的函數,而客戶端通過操作該函數,可以使用被當做參數傳過來的數據。

因為伺服器不限制script的跨域,所以不受跨域影響。

Websocket

眾所周知,Websocket是一個持久化協議,常用於解決伺服器推送問題。但是,實際上Websocket其實支持跨域通信。通過設置Websocket的origin的欄位,可以規定允許跨域的站點。

上面兩種方法雖然可以解決跨域,但是,都有著各種問題。

慶幸的是,本文的主角:CORS的出現,徹底解決了跨域問題。

CORS

瀏覽器將跨域AJAX請求分為兩類:簡單請求和非簡單請求,對應有兩種不同的處理方式。

簡單請求

何為簡單請求?

簡單請求就是滿足以下兩個條件的請求:

1.請求方法為HEAD、GET和POST

2.HTTP請求頭只包含:AcceptAccept-LanguageContent-LanguageLast-Event-ID以及值為application/x-www-form-urlencodedmultipart/form-datatext/plain三者之一的Content-Type

對於簡單請求,瀏覽器可以直接發送請求到伺服器,但是會在請求頭中添加一個origin欄位,該欄位用來說明請求的來源。伺服器會識別該欄位,判斷是否允許跨域。

如果允許跨域,伺服器會返回結果併在響應頭上添加三個欄位:

1.Access-Control-Allow-Origin

該欄位的值為Origin欄位的值,或者是*,表示伺服器接受任何源的跨域請求。

2.Access-Control-Allow-Credentials

可選欄位,它表示是否允許發送Cookie,值為true時,表示發送請求的時候允許發送Cookie,如果不包含該欄位,則表示不允許發送Cookie。

值得一提的是,如果伺服器允許發送Cookie,那麼不允許將Access-Control-Allow-Origin的值設為*

3.Access-Control-Expose-Headers

可選欄位,在沒有該欄位的情況下,針對跨域請求,XHR對象的getResponseHeader()方法只能拿到Cache-ControlContent-LanguageContent-TypeExpireLast-ModifiedPragma這六個欄位,該欄位可以設置額外可以拿到的欄位。

非簡單請求

不滿足簡單請求的跨域請求都是非簡單請求,比如PUT或DELETE方法。

不同於簡單請求的直接向伺服器請求,非簡單請求會在發送之前,先進行一次“預檢”(preflight),即,向伺服器發出一個OPTIONS請求,查詢伺服器是否允許它進行跨域請求。

如果伺服器不通過“預檢”,會返回一個error,客戶端可以通過onerror事件進行捕獲。

當伺服器通過“預檢”後,伺服器會進行響應,響應頭中含有CORS的相關欄位,分別是:

1.Access-Control-Allow-Origin

該欄位和簡單請求中的同名欄位一樣。

2.Access-Control-Allow-Methods

該欄位表示伺服器支持跨域的所有方法,是一個逗號分隔的字元串,如:POST,DELETE。

3.Access-Control-Allow-Headers

該欄位表示伺服器支持的所有頭信息,也是一個逗號分隔的字元串。

4.Access-Control-Allow-Credentials

可選欄位,與簡單請求中的同名欄位一樣。

5.Access-Control-Max-Age

可選欄位,在一段時間內,瀏覽器對同一個功能變數名稱進行非簡單跨域請求,只對第一次進行“預檢”,而這一次“預檢”的結果將被緩存,接下來的請求都通過該結果進行判斷。該欄位就是用來設置“預檢”結果緩存的時間長短,可以將其值設為-1來禁用“預檢”緩存。

接收到伺服器通過“預檢”的響應後,客戶端會正式發送真正的請求,接下來的處理方式和簡單請求一致。

總結

在當前開發中,當不需要相容老式瀏覽器中,我們一般採用CORS的方式進行跨域請求,因為相比Websocket,CORS支持非長連接場景;相比JSONP,CORS支持所有HTTP請求,用法更加平滑。

當然,值得一提的是,當你需要相容老式瀏覽器時,JSONP是你唯一的選擇~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 很多同學想從事數據科學崗位,對於這個崗位而言,數學知識的儲備重要嗎? 答案顯而易見,掌握好數學對於從事該崗位而言是很重要的。數學一直是任何當代科學學科的基礎,幾乎所有的現代數據科學技術(包括所有的機器學習)都有一些深刻的數學知識。在本文中,我們將討論想成為一名優秀的數據科學家應該掌握的基本數學知識, ...
  • sql server中函數分別有:表值函數、標量函數、聚合函數、系統函數。這些函數中除系統函數外其他函數都需要用戶進行自定義。 一、表值函數 簡單表值函數 創建 create function fu_selectUser 創建 create function fu_selectUser ( ( ) ...
  • 如果你零基礎想轉行學習大數據,剛開始很多人會有無從下手的情況,大數據都要學習什麼內容?接下來小編給大家介紹一下。 大數據都要學習什麼內容——階段一 Linux操作系統的學習。 這個時候可能會偏理論一些,可能會比較枯燥,但是基礎很重要,主要學習點包括:Linux系統的歷史、發展與企業應用現狀;Linu ...
  • 計劃寫的博客的目錄。我會一個一個的去寫,寫完後,更新相應的鏈接到對應的博客目錄 ...
  • MySQL中一條SQL的加鎖分析 id主鍵 + RC id唯一索引 + RC id非唯一索引 + RC id無索引 + RC id主鍵 + RR id唯一索引 + RR id非唯一索引 + RR id無索引 + RR Serializable 一條複雜的SQL 死鎖原理與分析 SQL1:select ...
  • 本文適合這些人閱讀:iOS開發者、Android開發者、小程式開發人員、H5開發人員等客戶端開發人員。 今天要給客戶端開發者們介紹的一個介面是iiiLab提供的視頻去水印解析介面,介面特點: 1. 通用介面支持解析抖音、快手、火山、今日頭條、西瓜視頻、微博、秒拍、小咖秀、晃咖、微視、美拍、網易雲音樂 ...
  • 標把1-10之間所有的奇數,放到數組中,既然是1--10的奇數,那就要判斷,判斷是否是奇數,當然也要定義一個空的數組,如果判斷的結果是奇數,那就將結果存放在空的數組中。 第一種方法,是運用數組的方法,將奇數追加在空數組中, 第二種方法,將數組的索引值寫成數組的長度,並將索引值賦值 第三種方法,定義一 ...
  • 一、JavaScript特點 二、JavaScript三大部分:(ECMAScript、DOM、BOM) 三、JavaScript的基本語法 變數聲明 Js是一種弱數據類型的語言,任何類型的變數都用關鍵字Var來聲明。 賦值可以在聲明的的同時賦值,也可以在後面賦值。 這兩種方法是一樣的。 同時有一種 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...