spring gateway如何解決跨域問題
報錯截圖
報錯意思是請求頭中沒有Access-Control-Allow-Origin
報錯分析
但我在網關的配置文件中早就加了跨域的配置了
嘗試解決
于是我上網開始查
但是網上的代碼要么方法過時報錯,要么就向配置文件原因沒有起作用,好在我堅持不懈的查詢下,把所有有用的信息拼湊成了一個有用的配置方法
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.springframework.web.util.pattern.PathPatternParser; @Configuration public class CorsConfig { @Bean public CorsWebFilter corsWebFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedMethod("*"); // 允許任何方法(post、get等) config.addAllowedOrigin("*"); // 允許任何域名使用 config.addAllowedHeader("*"); // 允許任何頭 config.setAllowCredentials(true); //允許接受cookie UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); } }
只要在網關微服務下創(chuàng)建一個配置類把這段代碼加進去即可
于是
重新啟動
好家伙
再次報錯,不過這次不是沒有該屬性,而是兩個?。?/p>
那既然這樣
我就試試只用代碼配置,而注釋配置文件配置(因為開始就是配置文件配置無效)
重啟走起
依然報重復錯誤。。。。
最終
最后通過調試發(fā)現
請求發(fā)往網關后,再次發(fā)往其他微服務,而該微服務的controller類上配置了跨域注解
這就導致了兩次Access-Control-Allow-Origin被設置了
所有只要把@CrossOrigin注解去了即可
再次重啟
總結
除了為啥在配置文件里配置沒有生效沒搞懂外,其他都能理解
同時這里也解釋了一個問題,為啥要專門寫一個接口api模塊來專門實現微服務間的調用
從這里調用用戶微服務來看,網關配置了跨域,那么其他的微服務就不能配置跨域了
那這樣微服務如果直接調用就成了跨域了,而api接口模塊就很好的解決了這個問題,同時也限制了服務與服務見可調用接口的數量,按需來調用,看來當初聽老師話多創(chuàng)建一個api接口模塊是有原因的啊
解決睡覺!
補充?。?!
后來發(fā)現
刪除其他微服務的跨域配置在vue連接里可行
但是如果在html頁面直接發(fā)送axios請求后臺數據
請求網關可行,但是請求完了網關,網關會進行一次頁面轉發(fā)
這就使得第二次請求沒有Access-Control-Allow-Origin報跨域請求
如果將后臺服務的跨域配置重新寫上
又會出現Access-Control-Allow-Origin重復的問題。。。
好在查到了大佬的帖子,可以在配置文件找那個添加一段過濾配置
解決重復跨域問題,進行header去重
spring: cloud: gateway: default-filters: - DedupeResponseHeader=Vary Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE - DedupeResponseHeader=Access-Control-Allow-Origin, RETAIN_FIRST
至于帖子中寫的解決cookie跨域問題,,,我試了,似乎沒有效果,一樣報跨域錯誤,于是我在配置類嘗試著找相關方法,還真有!
只需要在配置類里添加以一段設置cookie允許跨域的配置(已經在上面的配置方法里補充了cookie跨域代碼)
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
java異步編程CompletableFuture使用示例詳解
這篇文章主要為大家介紹了java異步編程CompletableFuture使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11java使用randomaccessfile在文件任意位置寫入數據
Java在文件任意位置寫入數據可以使用RandomAccessFile方法來完成,下面看一個簡單的示例就明白了2014-01-01Springboot+mybatis-plus+注解實現數據權限隔離
本文將結合實例代碼,介紹Springboot+mybatis-plus+注解實現數據權限隔離,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07