現在,因爲項目中需要前後端分離部署,所以需要解決跨域的問題。
很多人對跨域有一種誤解,以爲這是前端的事,和後端沒關係,其實不是這樣的。
跨域可以在前端通過 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雲筆記