Django配置Ajax跨域呼叫 設定Cookie

2021-10-07 21:32:41 字數 1812 閱讀 4747

跨域呼叫

前端單純的想要通過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位址的相對映。...