一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot開發技巧之如何處理跨域請求CORS

SpringBoot開發技巧之如何處理跨域請求CORS

2022-03-03 00:59飄渺Jam Java教程

CORS(Cross-Origin Resource Sharing)"跨域資源共享",是一個W3C標準,它允許瀏覽器向跨域服務器發送Ajax請求,打破了Ajax只能訪問本站內的資源限制

在前后分離的架構下,我們經常會遇到跨域CORS問題,在瀏覽器上的表現就是出現如下一段錯誤提示:

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

下面看一下如何讓你的SpringBoot項目支持CORS跨域。

SpringBoot處理跨域

在SpringBoot后端處理跨域比較簡單,只需要在項目中添加如下一個配置類即可:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * Spring Boot 2.0 解決跨域問題
 * @Author javadaily
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
 @Bean
 public CorsFilter corsFilter() {
  final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
  final CorsConfiguration corsConfiguration = new CorsConfiguration();
  /* 是否允許請求帶有驗證信息 */
  corsConfiguration.setAllowCredentials(true);
  /* 允許訪問的客戶端域名 */
  corsConfiguration.addAllowedOrigin("*");
  /* 允許服務端訪問的客戶端請求頭 */
  corsConfiguration.addAllowedHeader("*");
  /* 允許訪問的方法名,GET POST等 */
  corsConfiguration.addAllowedMethod("*");
  urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
  return new CorsFilter(urlBasedCorsConfigurationSource);
 }
}

這里我們在配置類中注入了 CorsFilter并重寫了相關配置,大家可以根據自己的業務需求請里面的 * 改成具體的屬性值。

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

特殊情況

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

SpringBoot開發技巧之如何處理跨域請求CORS

在這種情況下是不會繼續執行后面的過濾器鏈的。

而在SpringBoot中自定義過濾器的優先級高于WebMvcConfigurer中定義的過濾器,所以此時由于未經過CORS過濾器的處理還是會出現跨域現象。

這種時候我們就需要改寫CorsFilter的寫法,讓其在自定義過濾器之前執行。

解決方法

自定義Cors過濾器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class CustomerCorsFilter extends CorsFilter {
     public CustomerCorsFilter() {
        super(configurationSource());
    }
     private static UrlBasedCorsConfigurationSource configurationSource() {
        // CORS授權
        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;
    }
}

通過配置類指定過濾器的優先級

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@Configuration
public class FilterConfig {
 
    @Bean
    public Filter authFilter(){
        return new AuthFilter();
    }
    /**
     * WARNING :跨域過濾器,注意執行順序,必須要在AuthFilter過濾器之后
     * @return
     */
    @Bean
    public FilterRegistrationBean corsFilterRegistration() {
         FilterRegistrationBean registration = new FilterRegistrationBean();
        //添加過濾器
        registration.setFilter(new CustomerCorsFilter());
        List<String> urlList = new ArrayList<>();
        urlList.add("/*");
        //設置過濾路徑,/*所有路徑
        registration.setUrlPatterns(urlList);
        //添加默認參數
        registration.setName("CorsFilter");
        //設置優先級
        registration.setOrder(-1);
        return registration;
    }
    @Bean
    public FilterRegistrationBean authFilterRegistration() {
         FilterRegistrationBean registration = new FilterRegistrationBean();
        //添加過濾器
        registration.setFilter(authFilter());
        List<String> urlList = new ArrayList<>();
        urlList.add("/*");
        //設置過濾路徑,/*所有路徑
        registration.setUrlPatterns(urlList);
        //添加默認參數
        registration.setName("authFilter");
        //設置優先級
        registration.setOrder(1);
        return registration;
    }
 
}

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

注意:order的順序越小優先級越高。

以上就是SpringBoot開發技巧之如何處理跨域請求CORS的詳細內容,更多關于SpringBoot開發處理跨域請求CORS的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/jianzhang11/article/details/115327719

延伸 · 閱讀

精彩推薦
  • Java教程Java中寫了個AOP,差點被開除

    Java中寫了個AOP,差點被開除

    今天小A同學來了一家公司入職,發現公司的代碼對于日志的處理非常不好,全部都是在代碼中直接采用硬編碼輸出,沒有統一進行處理。...

    今日頭條5192020-11-18
  • Java教程Java Socket編程實現簡單的問候服務

    Java Socket編程實現簡單的問候服務

    這篇文章主要為大家介紹了Java Socket編程實現簡單的問候服務,具有一定的參考價值,感興趣的小伙伴們可以參考一下 ...

    gloomyfish4582020-03-22
  • Java教程運用示例詳細總結Java多線程

    運用示例詳細總結Java多線程

    本文主要講解了Java多線程,該篇幅大量使用代碼以及圖片文字進行解析,可以讓小伙伴們了解該方面的知識更加迅速快捷...

    Java團長11942021-11-23
  • Java教程Java整型數與網絡字節序byte[]數組轉換關系詳解

    Java整型數與網絡字節序byte[]數組轉換關系詳解

    這篇文章主要介紹了Java整型數與網絡字節序byte[]數組轉換關系,結合實例形式歸納整理了java整型數和網絡字節序的byte[]之間轉換的各種情況,需要的朋友可以...

    Devin Zhang1372020-12-23
  • Java教程Java模糊查詢方法詳解

    Java模糊查詢方法詳解

    這篇文章主要為大家詳細介紹了Java模糊查詢方法的實現,實例教你如何用Java做模糊查詢結果,感興趣的小伙伴們可以參考一下 ...

    java教程網5572020-04-22
  • Java教程Spring集成MyBatis框架

    Spring集成MyBatis框架

    本文主要介紹了Spring集成MyBatis的配置和使用,項目基于Maven構建,連接Mysql數據庫。下面跟著小編一起來看下吧 ...

    Lekko.Li3142020-08-03
  • Java教程Java線程讓步_動力節點Java學院整理

    Java線程讓步_動力節點Java學院整理

    yield()的作用是讓步。它能讓當前線程由“運行狀態”進入到“就緒狀態”,從而讓其它具有相同優先級的等待線程獲取執行權。下面通過本文給大家介紹...

    動力節點1622020-10-28
  • Java教程java自定義實現base64編碼轉換

    java自定義實現base64編碼轉換

    本文主要介紹了java 自定義實現base64編碼轉換的方法,具有很好的參考價值,下面跟著小編一起來看下吧...

    不被女生喜歡好多年5202020-08-18
主站蜘蛛池模板: 哇嘎在线精品视频在线观看 | 99久久精品免费看国产高清 | 国产第一综合另类色区奇米 | 91高清国产视频 | 99久久爱热6在线播放 | 色在线影院| 粉嫩国产14xxxxx0000 | 国产经典一区 | 超碰97 | 日本深夜影院 | 91真人毛片一级在线播放 | 5g影院天天5g爽天天看 | 艹b视频在线观看 | 6080伦理久久精品亚洲 | 99亚洲自拍 | 久久亚洲精品中文字幕60分钟 | 国产日韩精品一区二区 | 娇小老少配xxxxx性视频 | 国内精品久久久久影院中国 | 精品日韩二区三区精品视频 | 日韩国产欧美成人一区二区影院 | 四虎免费影院4hu永久免费 | 冰漪丰满大乳人体图片欣赏 | 欧美在线高清 | 亚洲入口 | nxgx在线观看国产中文 | 青苹果乐园影院在线播放 | 日本在线观看视频 | 国产免费资源高清小视频在线观看 | 美女脱了内裤打开腿让你桶爽 | 视频二区 素人 欧美 日韩 | 国产成人www | 精品国产免费久久久久久 | 国产精品夜色视频一级区 | 日本不卡免免费观看 | 欧美一区二区三区视视频 | 精品欧美男同同性videos | 国产一级在线观看视频 | 深夜免费在线视频 | 毛片a级放荡的护士hd | 日本免费三区 |