SpringBoot配置Cors解決跨域請求問題

2021-09-11 21:50:18 字數 4648 閱讀 3312

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

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

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

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

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

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

受前面所講的瀏覽器同源策略的影響,不是同源的指令碼不能操作其他源下面的物件。想要操作另乙個源下的物件就需要跨域。 在同源策略的限制下,非同源的**之間不能傳送ajax請求。對於非簡單請求,瀏覽器首先會發起乙個option預檢請求,詢問伺服器,當前網頁所在的網域名稱是否在伺服器的許可名單之中,以及可以使用哪些http動詞和頭資訊字段。只有得到肯定答覆,瀏覽器才會發出正式的xmlhttprequest請求,否則就報錯。

為了解決瀏覽器同源問題,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

}

#如果想新增全域性配置,則需要新增乙個配置類 :

options請求也會經過***,在進行登入攔截時候要注意特殊處理

@configuration

public class webmvcconfig extends webmvcconfigureradapter

}

另外,還可以通過新增 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中新增響應的字段,並交給負責該請求的類處理,如果不合法,則拒絕該請求。

Tomcat 8 5 31版本下配置跨域CORS

這段 也是複製別人部落格上的 corsfilter org.apache.catalina.filters.corsfilter cors.allowed.origins cors.allowed.methods get,post,head,options,put cors.allowed.head...

SpringBoot常用配置

前言 springboot整合了主流的第三方框架,但是需要使用springboot那一套配置方式。但是我這裡只列舉了非常非常常用的,可以看已發的幾篇部落格,慢慢會補充。當然官方文件裡也有相應的配置,可惜沒有注釋。spring.resources.cache period 設定資源的快取時效,以秒為單...

Spring boot自動配置

1 從原始碼角度看spring boot 自動配置 這個方法呼叫的是 initialize sources suppresswarnings private void initialize object sources this.webenvironment deducewebenvironment...