前言
跨域問題我已經遇到許多次了,每次都是搞得滿頭問號,這次要把這個問題徹底梳理一下,弄明白問題的根源,以后就不會再手忙腳亂了。
跨域問題,大佬的這篇文章《SpringBoot配置Cors解決跨域請求問題》原理及解決方法寫的非常好,強烈推薦,我下面的內容主要是講后端開發如何進行調試。
另外,了解一下 Http 的內容協商機制,也有助於我們解決跨域問題,推薦下這篇文章《HTTP 協議中 Vary 的一些研究》
跨域問題
首先,跨域問題本質是因為瀏覽器的同源策略導致的。
1. 瀏覽器會為請求頭添加 Origin、Host 兩個字段,分別代表請求來源站點、請求的目標站點(域名或者ip+端口)。
2. 服務器收到請求后,根據 Origin 和 Host 兩個字段判斷是否是跨域請求。
3. 如果允許,則在 HTTP 頭信息中添加 Access-Control-Allow-Origin 字段,並返回正確的結果
4. 如果不 允許,則不在 HTTP 頭信息中添加 Access-Control-Allow-Origin 字段
用postman復現跨域問題
1. Postman 在請求Header上,並不會主動添加 Origin 字段,需要我們手動添加,如圖:

2. postman不管是否跨域,返回的都是200結果,因此不能用是否返回值判斷服務器是否允許跨域,而應該使用 response 的 Header 字段中是否存在允許跨域的字段來判斷是否允許跨域。
相關字段包括:
Access-Control-Allow-Origin 是否允許該請求訪問
Access-Control-Expose-Headers 可選,可以讓用戶拿到的字段。有幾個字段無論設置與否都可以拿到的,包括:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma
Access-Control-Allow-Credentials: 可選,用戶是否可以發送、處理 cookie

