什麼是跨域:django
瀏覽器的同源策略:跨域
請求的url地址,必須與瀏覽器上的url地址處於同域上,也就是域名,端口,協議相同,瀏覽器拒毫不是當前域域返回的數據瀏覽器
若是缺乏同源策略,瀏覽器很容易受到XSS,CSFR等攻擊。服務器
一般狀況下,A網頁訪問B服務器資源時,不知足如下三個條件其一就是跨域訪問
1. 協議不一樣
2. 端口不一樣
3. 主機不一樣
app
同源策略限制如下幾種行爲:cors
1.Cookie、LocalStorage、IndexDB沒法讀取url
2.DOM和JS對象沒法得到spa
3.AJAX請求不能發送code
如何解決:
CORS:跨域資源共享orm
整個CORS通訊過程,都是瀏覽器自動完成,不須要用戶參與。對於開發者來講,CORS通訊與同源的AJAX通訊沒有差異,代碼徹底同樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感受。
所以,實現CORS通訊的關鍵是服務器。只要服務器實現了CORS接口,就能夠跨源通訊。
簡單請求:發一次請求
解決簡單的跨域問題:
http://127.0.0.1:8000 向 http://127.0.0.1:8001端口發請求 http://127.0.0.1:8001端口設置 obj=HttpResponse('數據') obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000' return obj
非簡單請求:
非簡單請求是發送了兩次請求,第一次是預檢請求(OPTIONS請求),
當預檢經過,容許我發請求,再發送真實的請求
同時知足如下兩大條件,就是簡單請求:
(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
django中解決跨域問題:
安裝django-cors-headers模塊 在settings.py中配置 # 註冊app INSTALLED_APPS = [ ... 'corsheaders' ] # 添加中間件 MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware' ] # 容許跨域源 CORS_ORIGIN_ALLOW_ALL = True
解決跨域問題:(寫好這個中間件註冊一下)
class MyCorsMiddle(MiddlewareMixin):
def process_response(self, request, response): if request.method == 'OPTIONS': # 容許它 response['Access-Control-Allow-Headers'] = 'Content-Type' # obj['Access-Control-Allow-Headers']='*' # obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000' response['Access-Control-Allow-Origin'] = '*' return response