本文參考
一:什么是跨域?
- 所謂跨域, 是瀏覽器為了保護網站安全而建立的一種保護策略,既瀏覽器的同源策略。
- 意味着使用這些API的Web應用程序只能從加載應用程序的同一個域請求HTTP資源。
二: 什么情況下會觸發跨域問題?
- 域不同 (比如用 www.baidu.com 請求 www.zhihu.com)
- 端口不同 (比如 127.0.0.1:80 請求 127.0.0.1:81)
- 協議不同 (http://xxxx.com 請求 https://xxxx.com)
- 在瀏覽器發現不同后,會由瀏覽器發起一個跨域的HTTP請求
三:如何跨域?
- 跨域資源共享( CORS )機制允許 Web 應用服務器進行跨域訪問控制,從而使跨域數據傳輸得以安全進行。
- 現代瀏覽器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch )使用 CORS,以降低跨域 HTTP 請求所帶來的風險。
四:JSONP 跨域
- jsonp的核心則是動態添加<script>標簽來調用服務器提供的js腳本。
五:CORS 跨域資源共享
- 功能
- 跨域資源共享標准新增了一組 HTTP 首部字段,允許服務器聲明哪些源站通過瀏覽器有權限訪問哪些資源。
- 另外,對那些可能對服務器數據產生副作用的 HTTP 請求方法(特別是 GET 以外的 HTTP 請求)
- 瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求(preflight request),從而獲知服務端是否允許該跨域請求。
- 服務器確認允許之后,才發起實際的 HTTP 請求。
- 在預檢請求的返回中,服務器端也可以通知客戶端,是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認證相關數據)。
- 簡單請求
- 某些請求不會觸發 CORS 預檢請求。本文稱這樣的請求為“簡單請求”。
- 若請求滿足所有下述條件,則該請求可視為“簡單請求”:
- 使用下列方法之一:
- GET
- HEAD
- POST
- 流程
-
- 預檢請求
- 與前述簡單請求不同,“需預檢的請求”要求必須首先使用 OPTIONS 方法發起一個預檢請求到服務器,以獲知服務器是否允許該實際請求。
- "預檢請求“的使用,可以避免跨域請求對服務器的用戶數據產生未預期的影響。
- 當請求滿足下述任一條件時,即應首先發送預檢請求:
- 使用了下面任一 HTTP 方法:
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH
- 流程
-
- HTTP 響應字段
- Access-Control-Allow-Origin: <origin> | *
- origin 參數的值指定了允許訪問該資源的外域 URI。對於不需要攜帶身份憑證的請求,服務器可以指定該字段的值為通配符,表示允許來自所有域的請求。
- Access-Control-Allow-Methods: <method>[, <method>]*
- 首部字段用於預檢請求的響應。其指明了實際請求所允許使用的 HTTP 方法。
- 注意,簡單請求,這個字段的設置是無意義的
- Access-Control-Allow-Headers: <field-name>[, <field-name>]*
- 首部字段用於預檢請求的響應。其指明了實際請求中允許攜帶的首部字段。
- 注意,簡單請求,這個字段的設置是無意義的