springBoot中的CORS跨域注解@CrossOrigin詳解
1、概述
在任何現(xiàn)代瀏覽器中,隨著 HTML5 和 JS 客戶端的出現(xiàn),跨域資源共享 (CORS)是一項相關(guān)規(guī)范,這些客戶端通過 REST API 使用數(shù)據(jù)。
通常,服務(wù)于 JS 的主機(jī)(例如 example.com)與服務(wù)于數(shù)據(jù)的主機(jī)(例如 api.example.com)是不同的。在這種情況下,CORS 可以實現(xiàn)跨域通信。
Spring 為 CORS 提供一流的支持,為在任何 Spring 或 Spring Boot Web 應(yīng)用程序中配置它提供了一種簡單而強(qiáng)大的方式。
2.控制器方法CORS配置
啟用 CORS 很簡單——只需添加注釋@CrossOrigin。
我們可以通過幾種不同的方式實現(xià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)的緩存時間 ( 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) { // ... } }
這一次,我們在類級別添加了@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é)合來自兩個注解的屬性來創(chuàng)建一個合并的 CORS 配置。
在這里,兩個方法的maxAge都是 3,600 秒,remove()方法將允許所有來源,retrieve()方法只允許來自//example.com的來源。
3. 全局 CORS 配置
作為細(xì)粒度的基于注釋的配置的替代方案,Spring 允許我們在控制器之外定義一些全局 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)用程序中任何端點的 CORS 請求。
為了進(jìn)一步鎖定這一點,registry.addMapping方法返回一個CorsRegistration對象,我們可以將其用于其他配置。還有一個allowedOrigins方法可以讓我們指定一個允許來源的數(shù)組。如果我們需要在運(yùn)行時從外部源加載此數(shù)組,這將很有用。
此外,還有allowedMethods、allowedHeaders、exposedHeaders、maxAge 和allowCredentials,我們可以使用它們來設(shè)置響應(yīng)標(biāo)頭和自定義選項。
3.2 XML 命名空間
這個最小的 XML 配置在/**路徑模式上啟用了 CORS,其默認(rèn)屬性與 JavaConfig 相同:
<mvc:cors> <mvc:mapping path="/**" /> </mvc:cors>
也可以使用自定義屬性聲明多個 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
如果我們在項目中使用 Spring Security,我們必須采取額外的步驟來確保它與 CORS 兼容。那是因為需要先處理 CORS。否則,Spring Security 將在請求到達(dá) Spring MVC 之前拒絕該請求。
幸運(yùn)的是,Spring Security 提供了一個開箱即用的解決方案:
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and()... } }
這篇文章更詳細(xì)地解釋了它。
5. 它是如何工作的
CORS 請求會自動分派到各種已注冊的HandlerMappings。它們處理 CORS 預(yù)檢請求并使用CorsProcessor 實現(xiàn)(默認(rèn)為DefaultCorsProcessor)攔截 CORS 簡單和實際請求,以添加相關(guān)的 CORS 響應(yīng)標(biāo)頭(例如Access-Control-Allow-Origin)。
CorsConfiguration允許我們指定應(yīng)該如何處理 CORS 請求,包括允許的來源、標(biāo)頭和方法等。我們可以通過多種方式提供:
AbstractHandlerMapping#setCorsConfiguration()允許我們指定一個Map,其中幾個CorsConfiguration映射到路徑模式,例如/api/**。子類可以通過覆蓋AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)方法來提供自己的CorsConfiguration 。處理程序可以實現(xiàn)CorsConfigurationSource 接口(就像現(xiàn)在的ResourceHttpRequestHandler一樣)為每個請求提供CorsConfiguration。
6. 結(jié)論
在本文中,我們展示了 Spring 如何為在我們的應(yīng)用程序中啟用 CORS 提供支持。
我們從控制器的配置開始。我們看到我們只需要添加注解@CrossOrigin來啟用 CORS 到一個特定的方法或整個控制器。
此外,我們了解到,為了在控制器之外控制 CORS 配置,我們可以使用 JavaConfig 或 XML 在配置文件中順利執(zhí)行此操作。
到此這篇關(guān)于springBoot中的CORS跨域注解@CrossOrigin詳解的文章就介紹到這了,更多相關(guān)CORS跨域注解@CrossOrigin內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
List調(diào)用toString()方法后,去除兩頭的中括號實例
下面小編就為大家?guī)硪黄狶ist調(diào)用toString()方法后,去除兩頭的中括號實例。希望對大家有所幫助。一起跟隨小編過來看看吧2017-03-03解決swaggerUI頁面沒有顯示Controller方法的坑
這篇文章主要介紹了解決swaggerUI頁面沒有顯示Controller方法的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06springboot中關(guān)于自動建表,無法更新字段的問題
這篇文章主要介紹了springboot中關(guān)于自動建表,無法更新字段的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot結(jié)合Redis實現(xiàn)序列化的方法詳解
Spring提供了一個RedisTemplate來進(jìn)行對Redis的操作,但是RedisTemplate默認(rèn)配置的是使用Java本機(jī)序列化。如果要對對象操作,就不是那么的方便。所以本文為大家介紹了另一種SpringBoot結(jié)合Redis實現(xiàn)序列化的方法,需要的可以參考一下2022-06-06