跨域呼叫
前端單純的想要通過ajax跨域呼叫後端提供的api是比較簡單的,可謂是前人栽樹,後人乘涼,ottoyiu提供了解決django跨域問題的外掛程式django-cors-headers。
它的使用方法在github上介紹的是很詳盡的,我這裡總結一下基本的東西:
pip install django-cors-headers
...
'corsheaders',
...)
middleware = [ # or middleware_classes on django < 1.10
...'corsheaders.middleware.corsmiddleware',
'django.middleware.common.commonmiddleware',
...
要注意的是,corsmiddleware最好放的盡可能的往上,比如要 在commonmiddleware和whitenoisemiddleware的上邊,要不然設定的跨域響應頭可能起不了什麼作用。
最後配置一下你允許的跨域請求主機
允許所有主機請求你的api,這種設定下不能設定cookie,下文會說解決方案
cors_origin_allow_all = true
或者指定白名單。這裡注意有個坑,當前後端聯機除錯的時候,前端在瀏覽器寫localhost或127.0.0.1和本機的具體ip位址在白名單裡是不一樣的,推薦除錯的時候寫具體ip位址,白名單裡也寫具體ip位址。
cors_origin_whitelist = (
'172.30.203.52:8080',
'localhost:80'
)
其它的還有可以用正則配置白名單等,詳見github。
到這裡跨域呼叫是沒啥問題了,但是設定cookie還是不行。也就是說以下場景會出問題:
前台登陸,將使用者名稱密碼跨域傳到後台,後台校驗正確,把使用者填到session裡,把sessionid放到cookie中,返回response,這個時候前端發現自己仍然處於未登入狀態。
設定cookie
要跨域設定cookie,需要前後端的共同努力,首先看後端:
cors_origin_allow_all設為false,通過白名單的方式設定允許跨域請求的請求源,然後再設定cors_allow_credentials配置項為true,如下:
cors_allow_credentials = true
至此後端配置結束,然後是前端的工作:
前端只需要在沒乙個跨域的ajax請求體中新增乙個.withcredentials()欄位就可以啦,jquery示例如下:
$.ajax(
然後前後端就可以愉快的cookie互動啦~
ps: 雖然已經調通,但是前端在chrome中document.cookie還是看不到的,這個在資料三中有提到。
參考資料
1. django-cors-headers
2. ajax跨域訪問時,set-cookie無效問題的解決
3. 使用withcredentials傳送跨域請求憑據
django配置跨域
跨域是指乙個域下的文件或指令碼試圖去請求另乙個域下的資源,這裡跨域是廣義的。通常所說的跨域是狹義的,是由瀏覽器同源策略限制的一類請求場景。從乙個網域名稱的網頁去請求另乙個網域名稱的資源時,網域名稱 埠 協議任一不同,都是跨域。為了能夠使前端能夠訪問到django指令碼,我們就需要跨域了。這裡主要說明...
nginx配置ajax請求跨域
nginx配置 server 大致解釋如下 nginx監聽18081埠,如果是訪問的18081埠則進入監聽,add header四行即為配置的跨域資訊,proxy pass即為實際要訪問的請求位址,如伺服器位址為192.168.60.11,伺服器上有個tomcat埠為8080,外部ajax需要訪問該...
ajax跨域 ajax跨域學習總結(一)
網域名稱又稱網域 網域名稱,是由一串用點分隔的名字組成的internet上某一台計算機或計算機組的名稱,用於在資料傳輸時標識計算機的電子方位 有時也指地理位置 internet的核心服務dns domain name system,網域名稱系統,有時也簡稱為網域名稱 提供網域名稱到ip位址的相對映。...