springboot解決跨域問題

2021-09-24 11:17:43 字數 4366 閱讀 3780

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

[origin]就是協議、網域名稱和埠號。例如:這個url。

若位址裡面的協議、網域名稱和埠號均相同則屬於同源。

例如判斷下面的url是否與 同源

頁面中的鏈結,重定向以及表單提交是不會受到同源策略限制的;

跨域資源的引入是可以的。但是js不能讀寫載入的內容。如嵌入到頁面中的等。

受前面所講的瀏覽器同源策略的影響,不是同源的指令碼不能操作其他源下面的物件。想要操作另乙個源下的物件就需要跨域。 在同源策略的限制下,非同源的**之間不能傳送ajax請求。

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

cors做到了如下兩點:

基於這兩點,cors將請求分為兩類:簡單請求和非簡單請求。

1、簡單請求

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

乙個簡單的請求例子:

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

如果允許,則在 http 頭資訊中新增access-control-allow-origin字段,並返回正確的結果 ;

如果不 允許,則不在 http 頭資訊中新增access-control-allow-origin字段 。

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

access-control-allow-credentials: 可選,使用者是否可以傳送、處理cookie

access-control-expose-headers:可選,可以讓使用者拿到的字段。有幾個字段無論設定與否都可以拿到的,包括:cache-controlcontent-languagecontent-typeexpireslast-modifiedpragma

2、非簡單請求

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

例如乙個delete請求:

請求使用的http方法access-control-request-method

請求中包含的自定義頭欄位access-control-request-headers

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

access-control-allow-origin: 

access-control-allow-methods: get, post, put, delete

access-control-allow-headers: x-custom-header

access-control-allow-credentials: true

access-control-max-age: 1728000

他們的含義分別是:

access-control-allow-methods: 真實請求允許的方法

access-control-allow-headers: 伺服器允許使用的字段

access-control-allow-credentials: 是否允許使用者傳送、處理 cookie

access-control-max-age: 預檢請求的有效期,單位為秒。有效期內,不會重**送預檢請求

當預檢請求通過後,瀏覽器會傳送真實請求到伺服器。這就實現了跨源請求。

#如果想要對某一介面配置cors,可以在方法上新增@crossorigin註解 :

@crossorigin(origins = )

public string greetings

()";

}

#如果想對一系列介面新增 cors 配置,可以在類上新增註解,對該類宣告所有介面都有效:

@crossorigin(origins = )

@restcontroller

public

class

另外,還可以通過新增 filter 的方式,配置 cors 規則,並手動指定對哪些介面有效。

@bean

public filterregistrationbean corsfilter

()

無論是通過哪種方式配置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中新增響應的字段,並交給負責該請求的類處理,如果不合法,則拒絕該請求。

跨域 springboot 解決前後端跨域

cors協議 h5中的新特性 cross origin resource sharing 跨域資源共享 通過它,我們的開發者 主要指後端開發者 可以決定資源是否能被跨域訪問。cors是乙個w3c標準,它允許瀏覽器 目前ie8以下還不能被支援 像我們不同源的伺服器發出xmlhttprequest請求,...

SpringBoot解決跨域問題

之前寫php和python的時候都是通過新增header來實現跨域的,現在用springboot猛一遇到這個問題還真有點懵,不知道該怎麼加了,所以在網上找了些解決方案 package cn.ac.yangge.config import org.springframework.context.ann...

springboot解決跨域問題

名詞解釋參考 跨域,指的是瀏覽器不能執行其他 的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。所謂同源是指,網域名稱,協議,埠均相同 只要協議,子網域名稱,主網域名稱,埠號這四項組成部分中有一項不同,就可以認為是不同的域,不同的域之間互相訪問資源,就被稱之為跨域。configurat...