1. 程式人生 > >Axios傳送跨域請求時,預設不攜帶cookie的問題解決示例。

Axios傳送跨域請求時,預設不攜帶cookie的問題解決示例。

問題發現:

在使用vue開發學子商城專案時,發現登入頁面即使登入成功了,也無法將正確的登入狀態資訊傳遞迴主頁。


在這裡插入圖片描述


如圖:登陸成功之後,登入狀態碼為1,且通過cookie儲存下來,跳轉到首頁後通過axios請求獲取cookie中儲存的登入狀態碼。但是此時獲取到的狀態碼卻不正確,導致錯誤的原因是: axios請求預設不攜帶cookie


解決方案:

方案一、修改axios中的cookie配置。
通過查閱axios手冊我們可以發現,axios的請求配置預設是不攜帶cookie資訊的。


在這裡插入圖片描述


所以我回到程式碼傳送axios請求的位置,去設定 withCredentials的值為true,注意這裡的引數是以物件的形式設定。在login頁面和header頁面的axios請求中都需要設定。
header中的設定。


header元件中的設定。


login中的設定
login元件中的設定,注意這裡是post請求,withCredentials物件作為第三個引數設定。


一切都設定完成之後,啟動伺服器,檢視頁面效果,完美執行!
咳咳,你會發現居然報錯了。
在這裡插入圖片描述
檢查錯誤資訊,原來是因為啟用withCredentials之後,伺服器端的響應頭資訊中的Access-Control-Allow-Origin不能設定為“ * ”號。好吧,既然不能用*,那就乾脆寫成專案執行時的ip地址和和埠號。這裡設定為http://127.0.0.1:8080


在這裡插入圖片描述
在伺服器端路由中設定響應頭資訊。


確保一切都修改好之後,再執行伺服器,檢視設定是否成功。
終於修改好了!


你會發現還是在報錯,為什麼呢?
還是來檢視報錯原因。


在這裡插入圖片描述

用藍色箭頭標識出來了錯誤原因,是因為設定了withCredentials為true之後,響應頭訊息中的’Access-Control-Allow-Credentials’也應該設定為true。
找到了原因,繼續回到伺服器端路由中進行設定。


在這裡插入圖片描述


再執行伺服器,檢視程式碼效果!
這回終於修改好了!
在這裡插入圖片描述

可以看到,通過cookie成功的獲取到了登入狀態資訊!說明axios的cookie攜帶設定成功!

總結一下,如果想使用axios的withCredentials來傳遞cookie,需要以下步驟:
1.在axios請求的引數中,寫入物件屬性withCredentials:true
2.伺服器端響應頭訊息中的’Access-Control-Allow-Origin’不能設定為 ’ * ’ 號,需改成具體的id地址。
3.伺服器端響應頭訊息中必須設定 ‘Access-Control-Allow-Credentials’:‘true’。


方案二:通過定義window.uid全域性變數來解決。

此方法原理是當 islogin登入成功時,將uid返回到客戶端。然後客戶端將uid儲存到window.uid中,這樣另一個元件就可以直接從window.uid中讀取使用者id。當傳送axios請求時,再講使用者id作為引數傳送到伺服器中。【不建議這種做法,此為臨時解決方案。需要更改後臺很多資料,而且一次只能存一個變數。】

先不講這個,有時間來填坑。

方案三:通過vueX中的store狀態管理來解決。【推薦】