SpringBoot后端解決跨域問題的3種方案分享
1.跨域的介紹
跨源資源共享(CORS——Cross-Origin Resource Sharing,跨源資源共享,或通俗地譯為跨域資源共享)是一種基于 HTTP 頭的機(jī)制,該機(jī)制通過允許服務(wù)器標(biāo)示除了它自己以外的其它源(域、協(xié)議或端口),使得瀏覽器允許這些源訪問加載自己的資源??缭促Y源共享還通過一種機(jī)制來檢查服務(wù)器是否會允許要發(fā)送的真實(shí)請求,該機(jī)制通過瀏覽器發(fā)起一個(gè)到服務(wù)器托管的跨源資源的“預(yù)檢”請求。在預(yù)檢中,瀏覽器發(fā)送的頭中標(biāo)示有 HTTP 方法和真實(shí)請求中會用到的頭。
2.跨域產(chǎn)生原因
跨域問題所產(chǎn)生的原因是瀏覽器的“同源策略”所導(dǎo)致的。什么是同源策略呢,就是瀏覽器規(guī)定了,我當(dāng)前頁面和請求頁面的 1網(wǎng)絡(luò)協(xié)議、2主機(jī)域名、3端口,這三部分必須保證一模一樣才行。如下圖:
這也主要是瀏覽器為了保證用戶上網(wǎng)的基本安全需求而設(shè)置的。
1.為了防止惡意網(wǎng)頁可以獲取其他網(wǎng)站的本地?cái)?shù)據(jù)。
2.為了防止惡意網(wǎng)站iframe其他網(wǎng)站的時(shí)候,獲取數(shù)據(jù)。
3.為了防止惡意網(wǎng)站在自已網(wǎng)站有訪問其他網(wǎng)站的權(quán)利,以免通過cookie免登,拿到數(shù)據(jù)。
3.跨域的解決方案
跨域的解決方案有很多種,前后端都有。這里主要介紹下我所知道的三種方案,并配以代碼展示。
1.在后端被訪問代碼的方法上加注解@CrossOrign。這個(gè)注解是spring-web中的注解,我們只需在方法上面加注之后,就會解決CORS問題。例如:
/** * 獲取用戶信息 * * @return 用戶信息 */ @GetMapping("getInfo") @CrossOrigin public AjaxResult getInfo() { SysUser user = SecurityUtils.getLoginUser().getUser(); // 角色集合 Set<String> roles = permissionService.getRolePermission(user); // 權(quán)限集合 Set<String> permissions = permissionService.getMenuPermission(user); AjaxResult ajax = AjaxResult.success(); ajax.put("user", user); ajax.put("roles", roles); ajax.put("permissions", permissions); return ajax; }
但是,后端有很多被訪問的方法,我們不能在每個(gè)方法上面都加上這個(gè)注解,代碼冗余。所以就有了第二種方法,我們可以添加一個(gè)過濾器,來解決CORS問題,代碼如下:
@Configuration public class CORSFilter { @Bean public CorsFilter corsFilter(){ CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**",corsConfiguration); return new CorsFilter(source); } }
還有一種解決方法,我們可以通過實(shí)現(xiàn)接口并重寫方法來解決跨域問題,代碼如下:
@Configuration public class CORSConfiguration implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowedMethods("GET","POST","PUT","HEAD") .allowCredentials(true) .allowedHeaders("*") .maxAge(3600); } }
通過這三種方式,我們就可以解決CORS跨域問題。
總結(jié)
到此這篇關(guān)于SpringBoot后端解決跨域問題的3種方案的文章就介紹到這了,更多相關(guān)后端跨域問題解決內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud之@FeignClient()注解的使用詳解
@FeignClient是SpringCloud中用于聲明一個(gè)Feign客戶端的注解,用于解決模塊方法互相調(diào)用的問題,Feign是一個(gè)聲明式的WebService客戶端,通過Feign,只需要?jiǎng)?chuàng)建一個(gè)接口,并使用注解來描述請求,就可以直接執(zhí)行HTTP請求了2024-11-11MyBatis?超詳細(xì)講解動(dòng)態(tài)SQL的實(shí)現(xiàn)
動(dòng)態(tài)?SQL?是?MyBatis?的強(qiáng)大特性之一。如果你使用過?JDBC?或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接?SQL?語句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號。利用動(dòng)態(tài)?SQL,可以徹底擺脫這種痛苦2022-03-03淺談SpringCloud的微服務(wù)架構(gòu)組件
這篇文章主要介紹了淺談SpringCloud的微服務(wù)架構(gòu)組件,Spring Cloud根據(jù)分布式服務(wù)協(xié)調(diào)治理的需求成立了許多子項(xiàng)目,每個(gè)項(xiàng)目通過特定的組件去實(shí)現(xiàn),需要的朋友可以參考下2023-04-04SpringBoot和Vue項(xiàng)目服務(wù)器發(fā)布流程分享
本文詳細(xì)介紹了如何將SpringBoot和Vue項(xiàng)目發(fā)布到阿里云ECS服務(wù)器上的步驟,包括準(zhǔn)備服務(wù)器、安裝寶塔、配置數(shù)據(jù)庫、打包項(xiàng)目、上傳文件、設(shè)置端口、安裝軟件和注冊網(wǎng)站等2025-02-02RocketMQ之Consumer整體介紹啟動(dòng)源碼分析
這篇文章主要為大家介紹了RocketMQ源碼分析之Consumer整體介紹啟動(dòng)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Spring Boot應(yīng)用開發(fā)初探與實(shí)例講解
這篇文章主要介紹了Spring Boot應(yīng)用開發(fā)初探與實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07