SpringBoot實現(xiàn)跨域的幾種常用方式總結(jié)
一、什么是跨域
跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源,或者涉及到兩個不同域名的資源之間的交互。由于同源策略(Same Origin Policy)的限制,瀏覽器不允許跨域請求。同源策略規(guī)定,A網(wǎng)頁設(shè)置的Cookie、LocalStorage和IndexDB無法被同源以外的網(wǎng)頁讀取??缬蛘埱髸粸g覽器拒絕。舉個例子:- DOMAIN-A.com 和 DOMAIN-B.com 是兩個不同的域名,它們之間的請求就是跨域請求。- DOMAIN-A.com/dir1 和 DOMAIN-A.com/dir2 雖然路徑不同,但是域名相同,所以不是跨域。
二、跨域問題出現(xiàn)的原因
- 瀏覽器的同源策略(Same Origin Policy)限制了跨域請求。主要出于安全考慮,瀏覽器限制腳本只能讀取與之同源的資源。同源指的是協(xié)議、域名、端口都相同??缬蛘埱髸驗檫`反同源策略而被阻止。
- Cookie和本地存儲也遵循同源策略。A域名下的頁面無法讀取B域名下的Cookie、localStorage等。
- 跨域JavaScript請求會報錯。比如A頁面請求B頁面的JS文件,就會報錯。
- 跨域DOM無法訪問。A頁面的JS無法獲取B頁面的DOM節(jié)點。
- 跨域數(shù)據(jù)請求需要進行CORS預(yù)檢。瀏覽器會在正式通信之前,先進行一次HTTP查詢請求,詢問服務(wù)器是否允許跨源請求。
- iframe也受同源策略限制。A頁面的iframe嵌入B頁面,A頁面JS無法訪問iframe的DOM。
- 跨域圖片獲取限制。A頁面無法獲取B頁面img標(biāo)簽的src,會報錯。
三、常見的跨域請求方式
- JSONP:通過script標(biāo)簽加載JS文件來實現(xiàn)跨域通信。
- CORS:服務(wù)器端設(shè)置HTTP頭,允許指定的請求來源跨域訪問。
- postMessage:A域的window向B域的window發(fā)送消息,實現(xiàn)跨域通信。
四、SpringBoot實現(xiàn)跨域的幾種方式
1.@crossOrigin 注解我們可以在Controller的方法上直接使用@CrossOrigin注解,如:
@CrossOrigin(origins = "http://domain1.com") @RestController public class TestController { @GetMapping("/test") public String test() { return "hello"; } }
這種方式簡單適用,但是不能應(yīng)對所有的跨域請求,比較局限。
2.過濾器CorsFilter我們可以注冊CorsFilter跨域過濾器,如:
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("http://domain1.com"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
然后該過濾器會應(yīng)用到所有的請求上。這種方式配置更加靈活。
3.配置類WebMvcConfigurer我們可以在WebMvcConfigurer接口的addCorsMappings()方法中添加跨域配置,如:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://domain1.com") .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH") .allowedHeaders("*") .allowCredentials(true); } }
這也是一種比較常用的跨域解決方案。
到此這篇關(guān)于SpringBoot實現(xiàn)跨域的幾種常用方式總結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot實現(xiàn)跨域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ConcurrentHashMap是如何實現(xiàn)線程安全的你知道嗎
這篇文章主要介紹了ConcurrentHashMap是如何實現(xiàn)線程安全的你知道嗎,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10基于SpringBoot和Vue的動態(tài)語音播放實現(xiàn)
本文介紹如何使用SpringBoot和Vue實現(xiàn)音頻文件的動態(tài)播放,包括前端頁面設(shè)計、后端接口開發(fā)、音頻文件存儲和調(diào)用等方面。通過該實現(xiàn),用戶可以在網(wǎng)頁上直接播放音頻,增強用戶體驗,提高網(wǎng)站互動性2023-04-04java高級用法之綁定CPU的線程Thread?Affinity簡介
java線程thread affinity是用來將java代碼中的線程綁定到CPU特定的核上,用來提升程序運行的性能,這篇文章主要介紹了java高級用法之綁定CPU的線程thread affinity的相關(guān)知識,需要的朋友可以參考下2022-05-05關(guān)于spring.factories失效原因分析及解決
這篇文章主要介紹了關(guān)于spring.factories失效原因分析及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07