SpringBoot使用CORS解決跨域請求問題

2022-01-31 02:07:24 字數 3444 閱讀 6382

同源策略是瀏覽器的乙個安全功能,不同源的客戶端指令碼在沒有明確授權的情況下,不能讀寫對方資源。 同源策略是瀏覽器安全的基石。

如果乙個請求位址裡面的協議、網域名稱和埠號都相同,就屬於同源。

舉個栗子

判斷下面url是否和 同源

依據瀏覽器同源策略,非同源指令碼不可操作其他源下面的物件。想要操作其他源下的物件就需要跨域。

綜上所述,在同源策略的限制下,非同源的**之間不能傳送ajax請求。如有需要,可通過降域或其他技術實現。

為了解決瀏覽器跨域問題,w3c提出了跨源資源共享方案,即cors(cross-origin resource sharing)。

cors可以在不破壞即有規則的情況下,通過後端伺服器實現cors介面,就可以實現跨域通訊。

cors將請求分為兩類:簡單請求和非簡單請求,分別對跨域通訊提供了支援。

cors出現前,傳送http請求時在頭資訊中不能包含任何自定義字段,且http頭資訊不超過以下幾個字段:

乙個簡單請求的例子:

對於簡單請求,cors的策略是請求時在請求頭中增加乙個origin字段,伺服器收到請求後,根據該欄位判斷是否允許該請求訪問。

除了上面提到的access-control-allow-origin,還有幾個字段用於描述cors返回結果 :

對於非簡單請求的跨源請求,瀏覽器會在真實請求發出前,增加一次option請求,稱為預檢請求(preflight request)。預檢請求將真實請求的資訊,包括請求方法、自定義頭欄位、源資訊新增到 http 頭資訊欄位中,詢問伺服器是否允許這樣的操作。

例如乙個get請求:

伺服器收到請求時,需要分別對originaccess-control-request-methodaccess-control-request-headers進行驗證,驗證通過後,會在返回http頭資訊中新增 :

他們的含義分別是:

當預檢請求通過後,瀏覽器才會傳送真實請求到伺服器。這樣就實現了跨域資源的請求訪問。

spring mvc 4.2版本增加了對cors的支援,通過spring boot可以非常簡單的實現跨域訪問。

介面方法註解 ,僅對該介面方法有效:

@crossorigin(origins = )

/test

", method =requestmethod.get)

public

string greetings() ";

}

類註解,對該類宣告所有介面都有效:

@crossorigin(origins = )

@restcontroller

public

class

...}

全域性配置,作用全域性,需要新增乙個配置類 :

@configuration

public

class

corsconfig extends webmvcconfigureradapter

}

全域性過濾器,作用全域性,需要新增乙個過濾器 :

@configuration

public

class

corsconfig

}

無論是通過哪種方式配置cors,其實都是在構造corsconfiguration

乙個cors配置用乙個corsconfiguration類來表示,它的定義如下:

public

class

corsconfiguration

spring中對cors規則的校驗,都是通過委託給defaultcorsprocessor實現的。

defaultcorsprocessor處理過程如下:

判斷依據是header中是否包含origin。如果包含則說明為cors請求,轉到 2;否則,說明不是cors請求,不作任何處理。

判斷responseheader是否已經包含access-control-allow-origin,如果包含,證明已經被處理過了, 轉到 3,否則不再處理。

判斷是否同源,如果是則轉交給負責該請求的類處理

是否配置了cors規則,如果沒有配置,且是預檢請求,則拒絕該請求,如果沒有配置,且不是預檢請求,則交給負責該請求的類處理。如果配置了,則對該請求進行校驗。

校驗就是根據corsconfiguration這個類的配置進行判斷:

判斷origin是否合法

判斷method是否合法

判斷header是否合法

如果全部合法,則在response header中新增響應的字段,並交給負責該請求的類處理,如果不合法,則拒絕該請求。

出處: 

WAR包版本GeoServer設定CORS跨域

當前臺頁面請求wms可能會遇到瀏覽器以下提示 瀏覽器控制台 已阻止跨源請求 同源策略禁止讀取位於 的遠端資源。原因 cors 頭缺少 access control allow origin 原文大概這樣 網上找到的大部分cors配置都是針對geoserver安裝版的 像 基於cors的geoserv...

k8s下使用Ingress開啟跨域 CORS

在ingress中,跨域 cors 的配置如下 nginx.ingress.kubernetes.io cors allow headers dnt,x customheader,keep alive,user agent,x requested with,if modified since,cac...

SpringBoot使用thymeleaf模板

springboot開發的web專案contrller如何跳轉到前端頁面 據說,最流行的還是freemarker和velocity這兩種模板,我們這裡用spring官方推薦的thymeleaf模板 在建立好springboot專案的基礎上,進行如下配置 在pom中到thymeleaf的依賴 org....