欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springBoot中的CORS跨域注解@CrossOrigin詳解

 更新時間:2023年12月04日 08:31:40   作者:allway2  
這篇文章主要介紹了springBoot中的CORS跨域注解@CrossOrigin詳解,通常,服務(wù)于?JS?的主機(jī)(例如?example.com)與服務(wù)于數(shù)據(jù)的主機(jī)(例如?api.example.com)是不同的,在這種情況下,CORS?可以實現(xiàn)跨域通信,需要的朋友可以參考下

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()方法后,去除兩頭的中括號實例

    List調(diào)用toString()方法后,去除兩頭的中括號實例

    下面小編就為大家?guī)硪黄狶ist調(diào)用toString()方法后,去除兩頭的中括號實例。希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-03-03
  • 解決swaggerUI頁面沒有顯示Controller方法的坑

    解決swaggerUI頁面沒有顯示Controller方法的坑

    這篇文章主要介紹了解決swaggerUI頁面沒有顯示Controller方法的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java實現(xiàn)冒泡排序算法

    Java實現(xiàn)冒泡排序算法

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)冒泡排序算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Java中使用instanceof判斷對象類型的示例

    Java中使用instanceof判斷對象類型的示例

    在List<Object>中遍歷Object時,先判斷類型,再定向轉(zhuǎn)換,本文給大家介紹Java中使用instanceof判斷對象類型,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • IDEA 控制臺中文亂碼4種解決方案

    IDEA 控制臺中文亂碼4種解決方案

    IntelliJ IDEA 如果不進(jìn)行相關(guān)設(shè)置,可能會導(dǎo)致控制臺中文亂碼、配置文件中文亂碼等問題,本文主要介紹了IDEA控制臺中文亂碼4種解決方案,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • springboot中關(guān)于自動建表,無法更新字段的問題

    springboot中關(guān)于自動建表,無法更新字段的問題

    這篇文章主要介紹了springboot中關(guān)于自動建表,無法更新字段的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot結(jié)合Redis實現(xiàn)序列化的方法詳解

    SpringBoot結(jié)合Redis實現(xiàn)序列化的方法詳解

    Spring提供了一個RedisTemplate來進(jìn)行對Redis的操作,但是RedisTemplate默認(rèn)配置的是使用Java本機(jī)序列化。如果要對對象操作,就不是那么的方便。所以本文為大家介紹了另一種SpringBoot結(jié)合Redis實現(xiàn)序列化的方法,需要的可以參考一下
    2022-06-06
  • Spring如何使用通知?Advice?管理事務(wù)

    Spring如何使用通知?Advice?管理事務(wù)

    Spring 默認(rèn)采用聲明式事務(wù)管理(通過配置的方式) ,也可以實現(xiàn)編程式事務(wù)管理,這篇文章主要介紹了Spring使用通知Advice管理事務(wù),需要的朋友可以參考下
    2023-06-06
  • JAVA計算兩個日期相差的實例

    JAVA計算兩個日期相差的實例

    在java中我找了一下關(guān)于計算兩個日期之間相差的天數(shù)方法有10多種實現(xiàn)方法,下面總結(jié)一下常用的幾種計算兩個日期之間相差的天數(shù)實例
    2013-11-11
  • Java socket字節(jié)流傳輸示例解析

    Java socket字節(jié)流傳輸示例解析

    這篇文章主要為大家詳細(xì)介紹了Java socket字節(jié)流傳輸示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評論