Spring Boot 中如何解決跨域問題 ?

現在,因爲項目中需要前後端分離部署,所以需要解決跨域的問題。

很多人對跨域有一種誤解,以爲這是前端的事,和後端沒關係,其實不是這樣的。

跨域可以在前端通過 JSONP 來解決,但是 JSONP 只可以發送 GET 請求,無法發送其他類型的請求,在 RESTful 風格的應用中,就顯得非常雞肋。

因此,從代碼規範性,安全性,複雜度來講,我們推薦在後端通過 (CORS,Cross-origin resource sharing) 來解決跨域問題。

說到跨域,我們有必要先說說瀏覽器的“同源策略”問題,這是跨越問題產生的根源。

1、同源策略

所謂同源,是指協議、域名以及端口要相同。

同源策略是由Netscape提出的一個著名的安全策略,它是瀏覽器最核心也最基本的安全功能,現在所有支持JavaScript的瀏覽器都會使用這個策略。

同源策略是基於安全方面的考慮提出來的,這個策略本身沒問題,但是我們在實際開發中,由於各種原因又經常有跨域的需求。傳統的跨域方案是JSONP,JSONP雖然能解決跨域但是有一個很大的侷限性,那就是隻支持GET請求,不支持其他類型的請求。而今天我們說的CORS(跨域源資源共享)(CORS,Cross-origin resource sharing)是一個W3C標準,它是一份瀏覽器技術的規範,提供了Web服務從不同網域傳來沙盒腳本的方法,以避開瀏覽器的同源策略,這是JSONP模式的現代版。

2、CORS解決方案

在Spring框架中,對於CORS也提供了相應的解決方案,今天我們就來看看SpringBoot中如何實現CORS。

這種解決方案並非 Spring Boot 特有的,在傳統的 SSM 框架中,就可以通過 CORS 來解決跨域問題,只不過之前我們是在 XML 文件中配置 CORS ,現在可以通過實現WebMvcConfigurer接口,然後重寫addCorsMappings方法解決跨域問題

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .maxAge(3600);
    }

}

我們使用cookie存放用戶登錄的信息,在spring攔截器進行權限控制,當權限不符合時,直接返回給用戶固定的json結果。

當用戶登錄以後,正常使用;當用戶退出登錄狀態時或者token過期時,由於攔截器和跨域的順序有問題,出現了跨域的現象。

我們知道:一個http請求,先走filter,到達servlet後才進行攔截器的處理,如果我們把cors放在filter裏,就可以優先於權限攔截器執行

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }

}

3、總結

  • “同源策略”是跨越問題產生的根源;

  • 因爲項目中需要前後端分離部署,所以需要解決跨域的問題;

  • Spring Boot 通過實現WebMvcConfigurer接口,然後重寫addCorsMappings方法解決跨域問題;

  • 一個http請求,先走filter,到達servlet後才進行攔截器的處理,如果我們把cors放在filter裏,就可以優先於權限攔截器執行。

 

少俠請留步 ... ヾ(◍°∇°◍)ノ゙ ... 
歡迎點贊、評論、加關注,讓更多人看到學到賺到
更多精彩,請關注我的"今日頭條號":Java雲筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章