同源策略是瀏覽器的乙個安全功能,不同源的客戶端指令碼在沒有明確授權的情況下,不能讀寫對方資源。 同源策略是瀏覽器安全的基石。
如果乙個請求位址裡面的協議、網域名稱和埠號都相同,就屬於同源。
舉個栗子
判斷下面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
請求:
伺服器收到請求時,需要分別對origin
、access-control-request-method
、access-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
...}
全域性配置,作用全域性,需要新增乙個配置類 :
@configurationpublic
class
corsconfig extends webmvcconfigureradapter
}
全域性過濾器,作用全域性,需要新增乙個過濾器 :
@configurationpublic
class
corsconfig
}
無論是通過哪種方式配置cors
,其實都是在構造corsconfiguration
。
乙個cors
配置用乙個corsconfiguration
類來表示,它的定義如下:
publicclass
corsconfiguration
spring
中對cors
規則的校驗,都是通過委託給defaultcorsprocessor
實現的。
defaultcorsprocessor
處理過程如下:
判斷依據是header
中是否包含origin
。如果包含則說明為cors
請求,轉到 2;否則,說明不是cors
請求,不作任何處理。
判斷response
的header
是否已經包含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....