spring?cloud?Gateway如何處理跨域問題
spring cloud Gateway處理跨域問題
先簡單描述一下架構(gòu),項目采用前后端分離的方式,前端是nodejs來搞layui(單頁版),后端采用spring cloud Alibaba,網(wǎng)關(guān)用的是spring cloud Gateway,然后出現(xiàn)了跨域問題。
一開始百度我以為只需要在Controller上加上@CrossOrigin就能搞定,后來發(fā)現(xiàn)出現(xiàn)了很多問題。
問題一
因為后端還有網(wǎng)關(guān),所以如果你沒有自定的headers的頭信息那么是可以通過 spring cloud Gateway ,但是如果有加自定義Headers,這樣就會被 spring cloud Gateway給攔截,說:跨域請求中沒有自定的header
錯誤信息如下

考慮之后覺得應(yīng)該需要在spring cloud Gateway上添加跨域配置
添加方式有許多種,這里我寫出嘗試過可以用的兩種:
一在application.yml中添加配置
spring:
application:
name: nb-web
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedHeaders: "*"
allowedOrigins: "*"
allowCredentials: true
allowedMethods:
- GET
- POST
- DELETE
- PUT
- OPTION
第二種再啟動類上添加bean:
/**
* 配置跨域
* @return
*/
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
// cookie跨域
config.setAllowCredentials(Boolean.TRUE);
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
// 配置前端js允許訪問的自定義響應(yīng)頭
config.addExposedHeader("Authorization:");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
這樣就能解決自定義headers被攔截和跨域問題,但是這樣配置緊接著下一個問題又出來了
問題二
由于跨域配置會進行疊加,舉個例子你在服務(wù)一種添加了跨域配置,在spring cloud Gateway中也添加了,那這樣就會產(chǎn)生headers重復(fù)的問題:

前端就會報錯,

所以你必須要進行header去重,具體辦法如下:在spring cloud Gateway的過濾器中添加過濾配置
spring:
application:
name: nb-web
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
default-filters:
- DedupeResponseHeader=Vary Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
- DedupeResponseHeader=Access-Control-Allow-Origin, RETAIN_FIRST
這樣就能把重復(fù)的header給去掉了
這樣跨域問題基本就能解決了,但是因為我這邊需要進行session共享,所以需要給前端傳入cookie,那么問題又來了,后端配置的cookie傳不出去
原因有兩個1:沒有加上headers上面加上Access-Control-Allow-Credentials: true,這個可以在
gateway:
default-filters:
- AddResponseHeader=Access-Control-Allow-Credentials,true
添加上,還有一個就是前端的ajax上沒有加上:
, xhrFields: {withCredentials: true}
, crossDomain: true
這樣瀏覽器就能保存cookie
至此問題就能解決了。在查閱過程中我看到關(guān)于跨域配置重復(fù)問題是存在bug的,具體內(nèi)容可以參考:
http://www.dbjr.com.cn/program/319980elx.htm
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java同步鎖Synchronized底層源碼和原理剖析(推薦)
這篇文章主要介紹了Java同步鎖Synchronized底層源碼和原理剖析,釋放后,進入減減操作、直到為0然后喚醒隊列,讓他們?nèi)帄Z鎖,循環(huán)前面步驟,對Java同步鎖Synchronized相關(guān)知識感興趣的朋友一起看看吧2022-05-05
Java實戰(zhàn)之在線寄查快遞系統(tǒng)的實現(xiàn)
這篇文章主要介紹了如何利用Java制作一個在線寄查快遞系統(tǒng),文中采用的技術(shù)有java、SpringBoot、FreeMarker、Mysql,需要的可以參考一下2022-02-02
2024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境的過程
這篇文章主要介紹了2024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01
SpringBoot項目中獲取IP地址的實現(xiàn)示例
OkHttp是一個由Square開發(fā)的高效、現(xiàn)代的HTTP客戶端庫,本文主要介紹了SpringBoot項目中獲取IP地址的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-08-08
Springcloud服務(wù)注冊consul客戶端過程解析
這篇文章主要介紹了Springcloud服務(wù)注冊consul客戶端過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08

