springBoot中的CORS跨域注解@CrossOrigin詳解
1、概述
在任何現(xiàn)代瀏覽器中,隨著 HTML5 和 JS 客戶端的出現(xiàn),跨域資源共享 (CORS)是一項(xiàng)相關(guān)規(guī)范,這些客戶端通過 REST API 使用數(shù)據(jù)。
通常,服務(wù)于 JS 的主機(jī)(例如 example.com)與服務(wù)于數(shù)據(jù)的主機(jī)(例如 api.example.com)是不同的。在這種情況下,CORS 可以實(shí)現(xiàn)跨域通信。
Spring 為 CORS 提供一流的支持,為在任何 Spring 或 Spring Boot Web 應(yīng)用程序中配置它提供了一種簡單而強(qiáng)大的方式。
2.控制器方法CORS配置
啟用 CORS 很簡單——只需添加注釋@CrossOrigin。
我們可以通過幾種不同的方式實(shí)現(xiàn)這一點(diǎn)。
2.1 @CrossOrigin在@RequestMapping-帶注釋的處理程序方法上
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@RequestMapping(method = RequestMethod.GET, path = "/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}在上面的示例中,我們只為retrieve()方法啟用了 CORS 。我們可以看到我們沒有為@CrossOrigin注解設(shè)置任何配置,所以它使用默認(rèn)值:
- 允許所有來源。
- 允許的 HTTP 方法是在@RequestMapping注釋中指定的方法(本例中為 GET)。
- 預(yù)檢響應(yīng)的緩存時(shí)間 ( maxAge ) 為 30 分鐘。
2.2 控制器上的@CrossOrigin
@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@RequestMapping(method = RequestMethod.GET, path = "/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}這一次,我們?cè)陬惣?jí)別添加了@CrossOrigin。
因此,retrieve()和remove()方法都啟用了它。
我們可以通過指定注釋屬性之一的值來自定義配置:origins、methods、allowedHeaders、exposedHeaders、allowCredentials或maxAge。
2.3 @CrossOrigin關(guān)于控制器和處理程序方法
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin("http://example.com")
@RequestMapping(method = RequestMethod.GET, "/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}Spring 將結(jié)合來自兩個(gè)注解的屬性來創(chuàng)建一個(gè)合并的 CORS 配置。
在這里,兩個(gè)方法的maxAge都是 3,600 秒,remove()方法將允許所有來源,retrieve()方法只允許來自//example.com的來源。
3. 全局 CORS 配置
作為細(xì)粒度的基于注釋的配置的替代方案,Spring 允許我們?cè)诳刂破髦舛x一些全局 CORS 配置。這類似于使用基于Filter的解決方案,但可以在 Spring MVC 中聲明并結(jié)合細(xì)粒度的@CrossOrigin配置。
默認(rèn)情況下,允許所有來源和 GET、HEAD 和 POST 方法。
3.1 Java配置
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}上面的示例啟用了從任何來源到應(yīng)用程序中任何端點(diǎn)的 CORS 請(qǐng)求。
為了進(jìn)一步鎖定這一點(diǎn),registry.addMapping方法返回一個(gè)CorsRegistration對(duì)象,我們可以將其用于其他配置。還有一個(gè)allowedOrigins方法可以讓我們指定一個(gè)允許來源的數(shù)組。如果我們需要在運(yùn)行時(shí)從外部源加載此數(shù)組,這將很有用。
此外,還有allowedMethods、allowedHeaders、exposedHeaders、maxAge 和allowCredentials,我們可以使用它們來設(shè)置響應(yīng)標(biāo)頭和自定義選項(xiàng)。
3.2 XML 命名空間
這個(gè)最小的 XML 配置在/**路徑模式上啟用了 CORS,其默認(rèn)屬性與 JavaConfig 相同:
<mvc:cors>
<mvc:mapping path="/**" />
</mvc:cors>也可以使用自定義屬性聲明多個(gè) CORS 映射:
<mvc:cors>
<mvc:mapping path="/api/**"
allowed-origins="http://domain1.com, http://domain2.com"
allowed-methods="GET, PUT"
allowed-headers="header1, header2, header3"
exposed-headers="header1, header2" allow-credentials="false"
max-age="123" />
<mvc:mapping path="/resources/**"
allowed-origins="http://domain1.com" />
</mvc:cors>4. 帶有 Spring Security 的 CORS
如果我們?cè)陧?xiàng)目中使用 Spring Security,我們必須采取額外的步驟來確保它與 CORS 兼容。那是因?yàn)樾枰忍幚?CORS。否則,Spring Security 將在請(qǐng)求到達(dá) Spring MVC 之前拒絕該請(qǐng)求。
幸運(yùn)的是,Spring Security 提供了一個(gè)開箱即用的解決方案:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()...
}
}這篇文章更詳細(xì)地解釋了它。
5. 它是如何工作的
CORS 請(qǐng)求會(huì)自動(dòng)分派到各種已注冊(cè)的HandlerMappings。它們處理 CORS 預(yù)檢請(qǐng)求并使用CorsProcessor 實(shí)現(xiàn)(默認(rèn)為DefaultCorsProcessor)攔截 CORS 簡單和實(shí)際請(qǐng)求,以添加相關(guān)的 CORS 響應(yīng)標(biāo)頭(例如Access-Control-Allow-Origin)。
CorsConfiguration允許我們指定應(yīng)該如何處理 CORS 請(qǐng)求,包括允許的來源、標(biāo)頭和方法等。我們可以通過多種方式提供:
AbstractHandlerMapping#setCorsConfiguration()允許我們指定一個(gè)Map,其中幾個(gè)CorsConfiguration映射到路徑模式,例如/api/**。子類可以通過覆蓋AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)方法來提供自己的CorsConfiguration 。處理程序可以實(shí)現(xiàn)CorsConfigurationSource 接口(就像現(xiàn)在的ResourceHttpRequestHandler一樣)為每個(gè)請(qǐng)求提供CorsConfiguration。
6. 結(jié)論
在本文中,我們展示了 Spring 如何為在我們的應(yīng)用程序中啟用 CORS 提供支持。
我們從控制器的配置開始。我們看到我們只需要添加注解@CrossOrigin來啟用 CORS 到一個(gè)特定的方法或整個(gè)控制器。
此外,我們了解到,為了在控制器之外控制 CORS 配置,我們可以使用 JavaConfig 或 XML 在配置文件中順利執(zhí)行此操作。
到此這篇關(guān)于springBoot中的CORS跨域注解@CrossOrigin詳解的文章就介紹到這了,更多相關(guān)CORS跨域注解@CrossOrigin內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?AOP實(shí)現(xiàn)用戶登錄統(tǒng)一驗(yàn)證功能
這篇文章主要為大家詳細(xì)介紹了Spring?AOP如何實(shí)現(xiàn)用戶登錄統(tǒng)一驗(yàn)證功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)具有一定的借鑒價(jià)值,需要的可以參考一下2023-01-01
Netty分布式從recycler對(duì)象回收站獲取對(duì)象過程剖析
這篇文章主要為大家介紹了Netty分布式從recycler獲取對(duì)象的過程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
eclipse啟動(dòng)出現(xiàn)“failed to load the jni shared library”問題解決
這篇文章主要介紹了eclipse啟動(dòng)出現(xiàn)“failed to load the jni shared library”問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
詳解springboot-mysql-pagehelper分頁插件集成
這篇文章主要介紹了springboot-mysql-pagehelper分頁插件集成,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
java 遠(yuǎn)程文件url如何轉(zhuǎn)為輸入流
這篇文章主要介紹了java 遠(yuǎn)程文件url如何轉(zhuǎn)為輸入流方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

