一、withCredentials是什么?
? withCredentials
?是瀏覽器 XMLHttpRequest 或 Fetch API(以及 axios 等基于它們的庫)中的一個配置項,作用是控制跨域請求時是否攜帶 Cookie、HTTP 認證信息等憑證。
用更通俗的方式解釋:
二、核心作用
它就像一個 "通行證開關":
- 當設為?
true
?時:跨域請求會帶上當前域名下的 Cookie、HTTP 認證信息(如用戶名密碼)等 "身份憑證" - 當設為?
false
?時(默認值):跨域請求會自動忽略這些憑證,服務器無法識別你的身份
三、適用場景
跨域登錄狀態維持
比如你的前端在?a.com
,后端接口在?b.com
:- 登錄成功后,后端會在?
b.com
?域名下種一個 Cookie 作為登錄憑證 - 后續發請求時,如果?
withCredentials: true
,瀏覽器會把這個 Cookie 帶給?b.com
?服務器,證明 "我已經登錄過" - 如果不開啟,服務器會把你當成未登錄用戶
- 登錄成功后,后端會在?
跨域需要認證的接口
對于需要 HTTP 基礎認證(賬號密碼)、或依賴 Cookie 做權限校驗的接口,必須開啟這個配置才能正常訪問。
四、注意事項
后端必須配合
服務器響應頭必須包含?Access-Control-Allow-Credentials: true
,否則即使前端開了?withCredentials
,瀏覽器也會拒絕接收響應。影響跨域范圍
當使用?withCredentials
?時,后端?Access-Control-Allow-Origin
?不能設為?*
(通配符),必須指定具體的前端域名(如?https://a.com
)。同域請求不受影響
只有跨域請求時這個配置才起作用,同域名下的請求會自動攜帶憑證,無需手動設置。
? ? ? ? 簡單說,withCredentials
?就是為了解決 "跨域場景下如何證明我是誰" 的問題,是實現跨域登錄狀態共享的關鍵配置。
五、Cookie是什么時候攜帶上去的
當你設置?withCredentials: true
?后,Cookie 的攜帶是自動的,不需要你手動寫任何代碼去附加 Cookie。
具體來說:
Cookie 由服務器種下
比如登錄成功時,服務器會通過響應頭?Set-Cookie: xxx=xxx
?把 Cookie 存到瀏覽器里(這一步是服務器做的,前端不用管)。瀏覽器自動攜帶
當你下次用?withCredentials: true
?發請求到同一個服務器域名時,瀏覽器會自動找出該域名下的 Cookie,偷偷加到請求頭里發給服務器。
舉個例子:
- 你登錄?
api.xxx.com
?后,瀏覽器保存了服務器給的?token=abc123
?Cookie - 之后你用 axios 發請求:
axios.post('https://api.xxx.com/data', data, {withCredentials: true // 關鍵配置 })
- 瀏覽器會自動在請求頭里加?
Cookie: token=abc123
,你不用手動寫這行代碼
你只需要保證兩點:
- 前端請求時打開?
withCredentials: true
?開關 - 服務器之前已經給瀏覽器種下了該域名的 Cookie
剩下的攜帶工作,瀏覽器會自動完成,不用你手動處理 Cookie 內容。
六、大白話闡述(更好理解)
??withCredentials
?就是用來控制 axios 發送請求時,是否帶上?Cookie 信息?的開關。
舉個例子:
- 當你登錄某個網站后,服務器會給你一個 Cookie 作為 "身份憑證"
- 之后你再發請求時,如果?
withCredentials: true
,axios 就會自動帶上這個 Cookie,服務器就能認出你是誰 - 如果是?
false
(默認值),就不會帶 Cookie,服務器可能會把你當成未登錄的新用戶
這個參數主要用在?跨域請求?場景,比如你的前端和后端不在同一個域名下時,需要顯式設置?withCredentials: true
?才能讓 Cookie 正常傳遞,否則跨域請求會丟失 Cookie 信息。