跨域的前世今生系列。
核心: 跨域是瀏覽器的安全策略
跨域的具體規(guī)則 可參考https://blog.csdn.net/qq_38128179/article/details/84956552
可能產生跨域問題的地方,本來只有瀏覽器域蜗,次洼,瀏覽器在發(fā)送請求的 時候,根據(jù)請求的源的策略,來鑒定此請求是否跨域藻雪。
需要注意的點是雕崩。
本來魁索,跨域只是個瀏覽器的 概念,但是根據(jù)spring最新版本 的 默認 跨域策略為晨逝。
首先請求中 是否 包含 Origin 這個 header蛾默。如不包含此 header,則認為請求不來源于瀏覽器/無需跨域驗證捉貌。在有Origin header的時候支鸡,則根據(jù)服務端配置的 跨域規(guī)則來確定是否允許此請求冬念。
如果想要請求一定能通過,則需要保證
- 請求 中沒有 Origin 這個 header
- 服務端不進行跨域校驗
- 請求 中有 Origin 這個 header牧挣,并且 服務端開啟了 跨域校驗 的情況下急前,則 需要 保證規(guī)則的命中。
另:某些前端的請求庫瀑构,根據(jù) http標準裆针,在 發(fā)現(xiàn)自己是 跨域請求 的 同時 會先發(fā)送 一個 OPTION 請求。服務端必須響應此請求寺晌,返回一個httpstatus 200 的 空 的響應世吨。錯誤范例:返回一個 404/或者當做正常請求處理,均會導致無法正常響應呻征。
瀏覽器在發(fā)現(xiàn)本請求 沒有 跨域 時耘婚,將 不會 攜帶 Origin 這個 header
出于瀏覽器安全策略 web 請求庫 ,無法強制修改 header 中 的 Origin
在某些框架 下的應用 如 Electron 陆赋。其可以將web應用編譯為 桌面版 應用沐祷,在沒有設置的 情況下,其請求 可能會 自帶 一個 Origin 的header攒岛,值是 類似于 chrom://12312312 的一串字符串赖临,服務端無法配置一個特定的規(guī)則來識別 這個 Origin,需要Electron應用 手動配置此Origin為一個特定的 值灾锯,或者不傳遞此Origin兢榨。