最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot開(kāi)發(fā)技巧之如何處理跨域請(qǐng)求CORS

 更新時(shí)間:2021年10月28日 08:47:33   作者:飄渺Jam  
CORS(Cross-Origin Resource Sharing)"跨域資源共享",是一個(gè)W3C標(biāo)準(zhǔn),它允許瀏覽器向跨域服務(wù)器發(fā)送Ajax請(qǐng)求,打破了Ajax只能訪問(wèn)本站內(nèi)的資源限制

在前后分離的架構(gòu)下,我們經(jīng)常會(huì)遇到跨域CORS問(wèn)題,在瀏覽器上的表現(xiàn)就是出現(xiàn)如下一段錯(cuò)誤提示:

No 'Access-Control-Allow-Origin' header is present on the requested resource.

下面看一下如何讓你的SpringBoot項(xiàng)目支持CORS跨域。

SpringBoot處理跨域

在SpringBoot后端處理跨域比較簡(jiǎn)單,只需要在項(xiàng)目中添加如下一個(gè)配置類即可:

/**
 * Spring Boot 2.0 解決跨域問(wèn)題
 * @Author javadaily
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer { 
 @Bean
 public CorsFilter corsFilter() {
  final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
  final CorsConfiguration corsConfiguration = new CorsConfiguration();
  /* 是否允許請(qǐng)求帶有驗(yàn)證信息 */
  corsConfiguration.setAllowCredentials(true);
  /* 允許訪問(wèn)的客戶端域名 */
  corsConfiguration.addAllowedOrigin("*");
  /* 允許服務(wù)端訪問(wèn)的客戶端請(qǐng)求頭 */
  corsConfiguration.addAllowedHeader("*");
  /* 允許訪問(wèn)的方法名,GET POST等 */
  corsConfiguration.addAllowedMethod("*");
  urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
  return new CorsFilter(urlBasedCorsConfigurationSource);
 } 
}

這里我們?cè)谂渲妙愔凶⑷肓?CorsFilter并重寫(xiě)了相關(guān)配置,大家可以根據(jù)自己的業(yè)務(wù)需求請(qǐng)里面的 * 改成具體的屬性值。

通過(guò)上面的配置我們基本可以解決后端跨域問(wèn)題,但是在一些特定情況下還是還出現(xiàn)跨域。

特殊情況

當(dāng)項(xiàng)目中還有一個(gè)自定義過(guò)濾器,并且在過(guò)濾器中通過(guò) response.getWriter().print()直接向客戶端輸出返回信息:

在這種情況下是不會(huì)繼續(xù)執(zhí)行后面的過(guò)濾器鏈的。

而在SpringBoot中自定義過(guò)濾器的優(yōu)先級(jí)高于WebMvcConfigurer中定義的過(guò)濾器,所以此時(shí)由于未經(jīng)過(guò)CORS過(guò)濾器的處理還是會(huì)出現(xiàn)跨域現(xiàn)象。

這種時(shí)候我們就需要改寫(xiě)CorsFilter的寫(xiě)法,讓其在自定義過(guò)濾器之前執(zhí)行。

解決方法

自定義Cors過(guò)濾器

public class CustomerCorsFilter extends CorsFilter {
     public CustomerCorsFilter() {
        super(configurationSource());
    }
     private static UrlBasedCorsConfigurationSource configurationSource() {
        // CORS授權(quán)
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.addExposedHeader(HttpHeaders.SET_COOKIE);
        config.setMaxAge(3600L);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
                return source;
    } 
}

通過(guò)配置類指定過(guò)濾器的優(yōu)先級(jí)

@Configuration
public class FilterConfig {
 
    @Bean
    public Filter authFilter(){
        return new AuthFilter();
    } 
    /**
     * WARNING :跨域過(guò)濾器,注意執(zhí)行順序,必須要在AuthFilter過(guò)濾器之后
     * @return
     */
    @Bean
    public FilterRegistrationBean corsFilterRegistration() {
         FilterRegistrationBean registration = new FilterRegistrationBean();
        //添加過(guò)濾器
        registration.setFilter(new CustomerCorsFilter());
        List<String> urlList = new ArrayList<>();
        urlList.add("/*");
        //設(shè)置過(guò)濾路徑,/*所有路徑
        registration.setUrlPatterns(urlList);
        //添加默認(rèn)參數(shù)
        registration.setName("CorsFilter");
        //設(shè)置優(yōu)先級(jí)
        registration.setOrder(-1);
        return registration;
    } 
    @Bean
    public FilterRegistrationBean authFilterRegistration() {
         FilterRegistrationBean registration = new FilterRegistrationBean();
        //添加過(guò)濾器
        registration.setFilter(authFilter());
        List<String> urlList = new ArrayList<>();
        urlList.add("/*");
        //設(shè)置過(guò)濾路徑,/*所有路徑
        registration.setUrlPatterns(urlList);
        //添加默認(rèn)參數(shù)
        registration.setName("authFilter");
        //設(shè)置優(yōu)先級(jí)
        registration.setOrder(1);
        return registration;
    }
 
}

通過(guò)setOrder()方法指定過(guò)濾器的執(zhí)行順序,用以保證CORS過(guò)濾器先入自定義過(guò)濾器執(zhí)行。

注意:order的順序越小優(yōu)先級(jí)越高。

以上就是SpringBoot開(kāi)發(fā)技巧之如何處理跨域請(qǐng)求CORS的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot開(kāi)發(fā)處理跨域請(qǐng)求CORS的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot @Configuration和@Componment的區(qū)別及說(shuō)明

    springboot @Configuration和@Componment的區(qū)別及說(shuō)明

    這篇文章主要介紹了springboot @Configuration和@Componment的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java?輪詢鎖使用時(shí)遇到問(wèn)題解決方案

    Java?輪詢鎖使用時(shí)遇到問(wèn)題解決方案

    這篇文章主要介紹了Java?輪詢鎖使用時(shí)遇到問(wèn)題解決方案,當(dāng)我們遇到死鎖之后,除了可以手動(dòng)重啟程序解決之外,還可以考慮使用順序鎖和輪詢鎖,但是過(guò)程也會(huì)遇到一些問(wèn)題,接下來(lái)我們一起進(jìn)入下面文章了解解決方案,需要的小伙伴可以參考一下
    2022-05-05
  • springboot集成druid連接池配置的方法

    springboot集成druid連接池配置的方法

    這篇文章主要介紹了springboot集成druid連接池配置的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java?byte數(shù)組轉(zhuǎn)String的幾種常用方法

    java?byte數(shù)組轉(zhuǎn)String的幾種常用方法

    在Java中數(shù)組是一種非常常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),它可以用來(lái)存儲(chǔ)多個(gè)相同類型的數(shù)據(jù),有時(shí)候,我們需要將數(shù)組轉(zhuǎn)換為字符串,以便于輸出或者傳遞給其他方法,這篇文章主要給大家介紹了關(guān)于java?byte數(shù)組轉(zhuǎn)String的幾種常用方法,需要的朋友可以參考下
    2024-09-09
  • IntelliJ IDEA 創(chuàng)建spring boot 的Hello World 項(xiàng)目(圖解)

    IntelliJ IDEA 創(chuàng)建spring boot 的Hello World 項(xiàng)目(圖解)

    這篇文章主要介紹了IntelliJ IDEA 創(chuàng)建spring boot 的Hello World 項(xiàng)目的步驟詳解,需要的朋友可以參考下
    2018-01-01
  • Java中對(duì)象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson

    Java中對(duì)象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson

    這篇文章主要介紹了Java中對(duì)象?和?json?互轉(zhuǎn)?四種方式?json-lib、Gson、FastJson、Jackson,需要的朋友可以參考下
    2023-11-11
  • Spring Security組件一鍵接入驗(yàn)證碼登錄和小程序登錄的詳細(xì)過(guò)程

    Spring Security組件一鍵接入驗(yàn)證碼登錄和小程序登錄的詳細(xì)過(guò)程

    這篇文章主要介紹了Spring Security 一鍵接入驗(yàn)證碼登錄和小程序登錄,簡(jiǎn)單介紹一下這個(gè)插件包的相關(guān)知識(shí),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-04-04
  • Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解

    Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解

    這篇文章主要介紹了Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 在SpringBoot項(xiàng)目中實(shí)現(xiàn)讀寫(xiě)分離的流程步驟

    在SpringBoot項(xiàng)目中實(shí)現(xiàn)讀寫(xiě)分離的流程步驟

    SpringBoot作為一種快速開(kāi)發(fā)框架,廣泛應(yīng)用于Java項(xiàng)目中,在一些大型應(yīng)用中,數(shù)據(jù)庫(kù)的讀寫(xiě)分離是提升性能和擴(kuò)展性的一種重要手段,本文將介紹如何在SpringBoot項(xiàng)目中優(yōu)雅地實(shí)現(xiàn)讀寫(xiě)分離,并通過(guò)適當(dāng)?shù)拇a插入,詳細(xì)展開(kāi)實(shí)現(xiàn)步驟,同時(shí)進(jìn)行拓展和分析
    2023-11-11
  • mybatis報(bào)錯(cuò)?resultMapException的解決

    mybatis報(bào)錯(cuò)?resultMapException的解決

    這篇文章主要介紹了mybatis報(bào)錯(cuò)?resultMapException的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論

南康市| 上蔡县| 景谷| 金寨县| 定安县| 天长市| 巴东县| 嘉善县| 汕尾市| 关岭| 沅陵县| 保德县| 鸡泽县| 灌阳县| 黄浦区| 姚安县| 迁西县| 怀宁县| 陆河县| 尼木县| 镇沅| 广德县| 梅州市| 扬州市| 丹棱县| 昭苏县| 长阳| 河曲县| 定州市| 湖州市| 辽宁省| 乐安县| 陇川县| 佛冈县| 德兴市| 东乌珠穆沁旗| 兴城市| 东台市| 宁海县| 睢宁县| 黄龙县|