springBoot中的CORS跨域注解@CrossOrigin詳解
1、概述
在任何現(xiàn)代瀏覽器中,隨著 HTML5 和 JS 客戶端的出現(xiàn),跨域資源共享 (CORS)是一項(xiàng)相關(guān)規(guī)范,這些客戶端通過(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)用程序中配置它提供了一種簡(jiǎn)單而強(qiáng)大的方式。
2.控制器方法CORS配置
啟用 CORS 很簡(jiǎn)單——只需添加注釋@CrossOrigin。
我們可以通過(guò)幾種不同的方式實(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 。我們可以看到我們沒(méi)有為@CrossOrigin注解設(shè)置任何配置,所以它使用默認(rèn)值:
- 允許所有來(lái)源。
- 允許的 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()方法都啟用了它。
我們可以通過(guò)指定注釋屬性之一的值來(lái)自定義配置: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é)合來(lái)自兩個(gè)注解的屬性來(lái)創(chuàng)建一個(gè)合并的 CORS 配置。
在這里,兩個(gè)方法的maxAge都是 3,600 秒,remove()方法將允許所有來(lái)源,retrieve()方法只允許來(lái)自//example.com的來(lái)源。
3. 全局 CORS 配置
作為細(xì)粒度的基于注釋的配置的替代方案,Spring 允許我們?cè)诳刂破髦舛x一些全局 CORS 配置。這類似于使用基于Filter的解決方案,但可以在 Spring MVC 中聲明并結(jié)合細(xì)粒度的@CrossOrigin配置。
默認(rèn)情況下,允許所有來(lái)源和 GET、HEAD 和 POST 方法。
3.1 Java配置
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}上面的示例啟用了從任何來(lái)源到應(yīng)用程序中任何端點(diǎn)的 CORS 請(qǐng)求。
為了進(jìn)一步鎖定這一點(diǎn),registry.addMapping方法返回一個(gè)CorsRegistration對(duì)象,我們可以將其用于其他配置。還有一個(gè)allowedOrigins方法可以讓我們指定一個(gè)允許來(lái)源的數(shù)組。如果我們需要在運(yùn)行時(shí)從外部源加載此數(shù)組,這將很有用。
此外,還有allowedMethods、allowedHeaders、exposedHeaders、maxAge 和allowCredentials,我們可以使用它們來(lái)設(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,我們必須采取額外的步驟來(lái)確保它與 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 簡(jiǎn)單和實(shí)際請(qǐng)求,以添加相關(guān)的 CORS 響應(yīng)標(biāo)頭(例如Access-Control-Allow-Origin)。
CorsConfiguration允許我們指定應(yīng)該如何處理 CORS 請(qǐng)求,包括允許的來(lái)源、標(biāo)頭和方法等。我們可以通過(guò)多種方式提供:
AbstractHandlerMapping#setCorsConfiguration()允許我們指定一個(gè)Map,其中幾個(gè)CorsConfiguration映射到路徑模式,例如/api/**。子類可以通過(guò)覆蓋AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)方法來(lái)提供自己的CorsConfiguration 。處理程序可以實(shí)現(xiàn)CorsConfigurationSource 接口(就像現(xiàn)在的ResourceHttpRequestHandler一樣)為每個(gè)請(qǐng)求提供CorsConfiguration。
6. 結(jié)論
在本文中,我們展示了 Spring 如何為在我們的應(yīng)用程序中啟用 CORS 提供支持。
我們從控制器的配置開始。我們看到我們只需要添加注解@CrossOrigin來(lái)啟用 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)文章
List調(diào)用toString()方法后,去除兩頭的中括號(hào)實(shí)例
下面小編就為大家?guī)?lái)一篇List調(diào)用toString()方法后,去除兩頭的中括號(hào)實(shí)例。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
解決swaggerUI頁(yè)面沒(méi)有顯示Controller方法的坑
這篇文章主要介紹了解決swaggerUI頁(yè)面沒(méi)有顯示Controller方法的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java中使用instanceof判斷對(duì)象類型的示例
在List<Object>中遍歷Object時(shí),先判斷類型,再定向轉(zhuǎn)換,本文給大家介紹Java中使用instanceof判斷對(duì)象類型,感興趣的朋友跟隨小編一起看看吧2023-08-08
springboot中關(guān)于自動(dòng)建表,無(wú)法更新字段的問(wèn)題
這篇文章主要介紹了springboot中關(guān)于自動(dòng)建表,無(wú)法更新字段的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot結(jié)合Redis實(shí)現(xiàn)序列化的方法詳解
Spring提供了一個(gè)RedisTemplate來(lái)進(jìn)行對(duì)Redis的操作,但是RedisTemplate默認(rèn)配置的是使用Java本機(jī)序列化。如果要對(duì)對(duì)象操作,就不是那么的方便。所以本文為大家介紹了另一種SpringBoot結(jié)合Redis實(shí)現(xiàn)序列化的方法,需要的可以參考一下2022-06-06

