【一】說明
CORS(跨來源資源共享,Cross-Origin Resource Sharing)是一種瀏覽器技術的規范,旨在解決瀏覽器同源策略(Same-Origin Policy)的限制,使得Web服務可以從不同的網域(源)安全地加載資源。
(1)瀏覽器同源策略
同源策略 是瀏覽器的一種安全機制,用于限制在瀏覽器中加載的文檔或腳本如何與不同源(協議、域名和端口)的資源進行交互。具體來說,當一個頁面加載了來自特定源的資源后,該頁面只能與同源的資源進行交互,而無法直接訪問其他源的資源。 地址 :指的是域名或IP地址。端口 :HTTP默認端口是80,HTTPS默認端口是443。如果端口不同,即使域名和協議相同,也視為不同源。協議 :HTTP和HTTPS是兩種不同的協議,即使域名和端口相同,協議不同也視為不同源。
(2)CORS 跨域資源共享
CORS 是一種機制,允許服務器在響應中設置一些特殊的HTTP頭部,以授權其他域名下的頁面訪問自己的資源。這樣,就可以繞過瀏覽器的同源策略限制,實現跨域資源共享。CORS需要瀏覽器和服務器同時支持。對于瀏覽器來說,只要支持CORS的瀏覽器(如現代瀏覽器都支持,IE瀏覽器不能低于IE10),在發現AJAX請求跨源時,會自動添加一些附加的頭信息(如Origin字段),有時還會多出一次附加的請求(預檢請求,Preflight Request),但用戶不會有感覺。 對于服務器來說,只要服務器實現了CORS接口(即在響應中設置了正確的CORS頭部),就可以允許跨源通信。具體來說,服務器會在響應頭部中添加一些CORS相關的字段,如Access-Control-Allow-Origin
,來指定哪些源可以訪問該資源。
(3)CORS請求的分類
瀏覽器將CORS請求分成兩類:簡單請求(Simple Request)和非簡單請求(Not-So-Simple Request)。 簡單請求 :只要同時滿足 以下兩大條件,就屬于簡單請求: 請求方法是HEAD、GET、POST三者之一 HTTP的頭信息不超出Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(只限于三個值application/x-www-form-urlencoded、multipart/form-data、text/plain)這幾種字段。 非簡單請求 :不同時滿足簡單請求條件的請求都屬于非簡單請求。對于非簡單請求,瀏覽器會先發出一個預檢請求(Preflight Request),詢問服務器是否允許該跨域請求。如果服務器在預檢請求的響應中同意了該請求,瀏覽器才會發出實際的CORS請求。
【二】方法一:自定義
(1)自定義中間件
from django. utils. deprecation import MiddlewareMixin
class CorsMiddleWare ( MiddlewareMixin) : def process_response ( self, request, response) : if request. method== "OPTIONS" : response[ "Access-Control-Allow-Headers" ] = 'Content-Type, *' response[ 'Access-Control-Allow-Methods' ] = 'GET, POST, PUT, PATCH, DELETE, OPTIONS' response[ 'Access-Control-Max-Age' ] = 86400 response[ "Access-Control-Allow-Origin" ] = "*" return response
注意 在生產環境中,通常不建議將 Access-Control-Allow-Origin
設置為 *
,因為這可能會降低安全性。您應該將其設置為特定的源,如 'https://example.com'
。 Access-Control-Allow-Headers
也不應設置為 *
,除非您確實希望允許所有頭。通常,您應該明確列出您希望允許的頭,如 'Content-Type, X-Requested-With'
。
(2)添加到配置文件
MIDDLEWARE = [ '自定義中間位置.CorsMiddleWare' ,
]
【三】方法二:第三方
(1)使用pip安裝
pip install django-cors-headers
(2)注冊app
在Django項目的 settings.py
文件中,將 'corsheaders'
添加到 INSTALLED_APPS
列表中。
INSTALLED_APPS = ( . . . 'corsheaders' , . . .
)
(3)添加到中間件
在 settings.py
文件的 MIDDLEWARE
列表中,確保 'corsheaders.middleware.CorsMiddleware'
出現在其他中間件之前,但位于 'django.middleware.security.SecurityMiddleware'
之后(如果你使用了它)。
MIDDLEWARE = [ . . . 'django.middleware.security.SecurityMiddleware' , 'corsheaders.middleware.CorsMiddleware' , . . .
]
(4)配置CORS設置
在 settings.py
文件中,配置CORS相關的設置。
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = ( 'DELETE' , 'GET' , 'OPTIONS' , 'PATCH' , 'POST' , 'PUT' ,
)
CORS_ALLOW_HEADERS = ( 'accept-encoding' , 'authorization' , 'content-type' , 'dnt' , 'origin' , 'user-agent' , 'x-csrftoken' , 'x-requested-with' ,
)
(5)源碼簡單分析
檢查是否允許所有源 如果 CORS_ORIGIN_ALLOW_ALL
設置為 True
并且 CORS_ALLOW_CREDENTIALS
沒有設置為 True
(因為攜帶憑證的請求不允許使用 *
作為 Access-Control-Allow-Origin
的值),則中間件會將 Access-Control-Allow-Origin
設置為 *
。 處理OPTIONS請求 當接收到 OPTIONS
請求時(即預檢請求),中間件會根據 CORS_ALLOW_METHODS
和 CORS_ALLOW_HEADERS
的設置來設置相應的響應頭 Access-Control-Allow-Methods
和 Access-Control-Allow-Headers
。 可以發現自定義中間件就是簡化的這部分代碼