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被攔截和跨域問題,但是這樣配置緊接著下一個問題又出來了
問題二
由于跨域配置會進(jìn)行疊加,舉個例子你在服務(wù)一種添加了跨域配置,在spring cloud Gateway中也添加了,那這樣就會產(chǎn)生headers重復(fù)的問題:
前端就會報錯,
所以你必須要進(jìn)行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給去掉了
這樣跨域問題基本就能解決了,但是因為我這邊需要進(jìn)行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底層源碼和原理剖析,釋放后,進(jìn)入減減操作、直到為0然后喚醒隊列,讓他們?nèi)帄Z鎖,循環(huán)前面步驟,對Java同步鎖Synchronized相關(guān)知識感興趣的朋友一起看看吧2022-05-05Java實(shí)戰(zhàn)之在線寄查快遞系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Java制作一個在線寄查快遞系統(tǒng),文中采用的技術(shù)有java、SpringBoot、FreeMarker、Mysql,需要的可以參考一下2022-02-022024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境的過程
這篇文章主要介紹了2024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01SpringBoot2.7.14整合redis7的詳細(xì)過程
這篇文章主要介紹了SpringBoot2.7.14整合redis7的詳細(xì)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-10-10SpringBoot項目中獲取IP地址的實(shí)現(xiàn)示例
OkHttp是一個由Square開發(fā)的高效、現(xiàn)代的HTTP客戶端庫,本文主要介紹了SpringBoot項目中獲取IP地址的實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-08-08Springcloud服務(wù)注冊consul客戶端過程解析
這篇文章主要介紹了Springcloud服務(wù)注冊consul客戶端過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08