springboot解決使用localhost或127.0.01模擬CORS失效
前言
CORS (Cross-Origin Resource Sharing) 指的是一種機(jī)制,它允許不同源的網(wǎng)頁請求訪問另一個源服務(wù)器上的某些資源。通常情況下,如果 JavaScript 代碼在一個源中發(fā)起了 AJAX 請求,那么該請求只能訪問同源的資源,而不能訪問其他源的資源。這是由于瀏覽器的同源策略所限制的。
CORS(Cross-Origin Resource Sharing)規(guī)范將跨域請求分為簡單請求和復(fù)雜請求兩種類型。
- 簡單請求(Simple Request):
- 請求方法限制為 GET、POST、HEAD。
- 允許的請求頭字段為:Accept、Accept-Language、Content-Language、Content-Type(僅限于以下幾個值:application/x-www-form-urlencoded、multipart/form-data、text/plain)。
- 不允許使用自定義的請求頭字段。
簡單請求滿足上述要求時,瀏覽器會自動發(fā)送跨域請求,并且不會在正式請求之前發(fā)送預(yù)檢請求(OPTIONS 請求)。服務(wù)器只需在響應(yīng)中添加 Access-Control-Allow-Origin 頭字段,指定允許訪問的來源,即可完成跨域訪問。
- 復(fù)雜請求(Preflighted Request):
- 使用非簡單請求方法(如PUT、DELETE等)。
- 使用自定義的請求頭字段。
- Content-Type 的值為 application/json 之類的復(fù)雜 MIME 類型。
復(fù)雜請求不滿足簡單請求的要求時,瀏覽器會先發(fā)送預(yù)檢請求(OPTIONS 請求),以征詢服務(wù)器是否允許實際請求。服務(wù)器需要在預(yù)檢請求和實際請求的響應(yīng)中添加一系列的頭字段,包括 Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers 等,來指定允許訪問的來源、允許使用的方法、允許使用的請求頭字段等信息。
問題發(fā)現(xiàn)
在學(xué)習(xí)spring內(nèi)容時,有介紹CORS,按照示例代碼編寫后,運(yùn)行發(fā)現(xiàn)能請求成功,操作如下:
示例代碼:
@Controller public class MyController { @GetMapping("/index") @CrossOrigin(origins = "http://127.0.0.1") public ResponseEntity<String> index(){ return ResponseEntity.ok().body("index"); } }
請求:
使用127.0.0.1,發(fā)現(xiàn)能正常返回接口,按照網(wǎng)上說法,localhost
和127.0.0.1
不屬于同源。
同源是指在以下三個方面完全相同的情況下,兩個網(wǎng)頁才被認(rèn)為是同源的:
協(xié)議(Protocol):兩個網(wǎng)頁的協(xié)議必須相同,如都是使用 HTTP 或 HTTPS。
域名(Domain):兩個網(wǎng)頁的域名必須相同,包括子域名。例如,www.example.com 和 api.example.com 是不同的域名。
端口號(Port):如果指定了端口號,則兩個網(wǎng)頁的端口號必須相同。如果沒有指定端口號,默認(rèn)使用 80(HTTP)或 443(HTTPS)。
只有當(dāng)上述三個條件都滿足時,兩個網(wǎng)頁才被認(rèn)為是同源的,瀏覽器會將它們視為同一個應(yīng)用程序,允許它們之間進(jìn)行相互通信和資源共享。
跨域是指在不滿足同源策略的情況下,從一個域名的網(wǎng)頁向另一個域名的網(wǎng)頁發(fā)起請求。由于瀏覽器的安全策略限制,跨域請求通常是被禁止的,除非目標(biāo)服務(wù)器明確允許跨域請求。在跨域請求中,瀏覽器會發(fā)送預(yù)檢請求(OPTIONS 請求),以確定是否允許跨域訪問。
問題解決
在使用 Ajax 發(fā)起跨域請求時,瀏覽器會在請求頭中添加 Origin 字段。這個字段表示該請求的來源(即當(dāng)前頁面的域名)。服務(wù)器可以通過檢查這個字段來判斷是否允許該請求進(jìn)行跨域訪問。
例如,如果你的網(wǎng)頁位于 http://example.com
,而 Ajax 請求的目標(biāo)是 http://api.example.com/data
,則請求頭中會包含 Origin: http://example.com
。
所以問題的根本是,要在headers請求頭中添加Origin 字段(localhost
和127.0.0.1
同源,改為不同,不用過多糾結(jié),底層可能做了請求地址和請求頭的判斷,生產(chǎn)環(huán)境也不用這玩意當(dāng)域名的):
問題解決。
到此這篇關(guān)于springboot解決使用localhost或127.0.01模擬CORS失效的文章就介紹到這了,更多相關(guān)springboot CORS失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA8 stream中三個參數(shù)的reduce方法對List進(jìn)行分組統(tǒng)計操作
這篇文章主要介紹了JAVA8 stream中三個參數(shù)的reduce方法對List進(jìn)行分組統(tǒng)計操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Java多線程之鎖學(xué)習(xí)(增強(qiáng)版)
這篇文章主要為大家詳細(xì)介紹了Java多線程中鎖的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們了解線程有一定幫助,需要的可以參考一下2023-02-02Java Serializable和Parcelable詳解及實例代碼
這篇文章主要介紹了Java Serializable和Parcelable詳解,并附實例代碼的相關(guān)資料,需要的朋友可以參考下2016-09-09javaCV開發(fā)詳解之推流器和錄制器的實現(xiàn)
這篇文章主要介紹了javaCV開發(fā)詳解之推流器和錄制器實現(xiàn),對JavaCV感興趣的同學(xué),可以參考下2021-04-04Spring security權(quán)限配置與使用大全
Spring Security 本質(zhì)上是借助一系列的 Servlet Filter來提供各種安全性功能,但這并不需要我們手動去添加或者創(chuàng)建多個Filter,本文重點給大家介紹spring-security的配置與使用及實現(xiàn)方式,感興趣的朋友一起看看吧2021-09-09SpringBoot Shiro授權(quán)實現(xiàn)過程解析
這篇文章主要介紹了SpringBoot Shiro授權(quán)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11