Django框架(二十九)—— 跨域問題
阿新 • • 發佈:2018-12-24
目錄
跨域問題
一、同源策略
只允許當前頁面朝當前域下發請求,如果向其他域發請求,請求可以正常傳送,資料也可以拿回,但是被瀏覽器攔截了
只有IP和埠號都相同才是同一個域
二、CORS(跨域資源共享)
整個CORS通訊過程,都是瀏覽器自動完成,不需要使用者參與。對於開發者來說,CORS通訊與同源的AJAX通訊沒有差別,程式碼完全一樣。瀏覽器一旦發現AJAX請求跨源,就會自動新增一些附加的頭資訊,有時還會多出一次附加的請求,但使用者不會有感覺。
只要伺服器實現了CORS介面,就可以跨源通訊。
三、CORS兩種請求(簡單請求與非簡單請求)
# 原理
def test(request):
import json
obj=HttpResponse(json.dumps({'name':'lqz'}))
# obj['Access-Control-Allow-Origin']='*'
obj['Access-Control-Allow-Origin']='http://127.0.0.1:8004'
return obj
1、簡單請求(一次請求)
必須同時滿足以下來搞個條件,才能為簡單請求
(1) 請求方法是以下三種方法之一: HEAD GET POST (2)HTTP的頭資訊不超出以下幾種欄位: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不同時滿足上面兩個條件,就屬於非簡單請求。
2、非簡單請求(兩次請求)
一次預檢(OPTION請求),只有服務端允許發請求,才能繼續發第二次正常請求,即一次真正的請求
四、CORS在Django中的應用
1、簡單請求
(1)定義一箇中間件
from django.utils.deprecation import MiddlewareMixin class MyCorsMiddle(MiddlewareMixin): def process_response(self,request,response): # 允許http://127.0.0.1:8001域向我發請求 # response['Access-Control-Allow-Origin']='http://127.0.0.1:8001' # 允許所有人向我發請求 response['Access-Control-Allow-Origin'] = '*' return response
(2)註冊中介軟體
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'app01.MyMiddle.MyCorsMiddle'
]
2、非簡單請求
(1)定義一箇中間件
from django.utils.deprecation import MiddlewareMixin
class MyCorsMiddle(MiddlewareMixin):
def process_response(self,request,response):
# 處理簡單請求:
response['Access-Control-Allow-Origin'] = '*'
# 處理非簡單請求
if request.method == 'OPTIONS':
# 所有的頭資訊都允許
response['Access-Control-Allow-Headers'] = '*'
return response
(2)註冊中介軟體
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'app01.MyMiddle.MyCorsMiddle'
]
允許的域可以在配置檔案中配置