一、什么是跨域
前端頁面與后臺服務必須同源,即協議,域名,端口都要相同,其中有一個不同都會產生跨域;
如下圖,加深理解
二、解決方案
1、jsonp
前后端需要特殊處理,代碼不夠簡潔通用。服務器返回jsonp格式。
不推薦
2、Nginx
nginx起轉發的作用,實際就是把web項目和后端接口項目放到一個域中,但是需要運維特殊配置,不夠通用。
不推薦
3、cors
利用springboot 網關統一配置過濾器,所有請求經過該網關路由轉發到內部各服務器,不需要前端再做任何處理。
記住這一點,強烈推薦。
附過濾器源碼
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); final CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); // 允許cookies跨域 config.addAllowedOrigin("*");// #允許向該服務器提交請求的URI,*表示全部允許,在SpringMVC中,如果設成*,會自動轉成當前請求頭中的Origin config.addAllowedHeader("*");// #允許訪問的頭信息,*表示全部 config.setMaxAge(3600L);// 預檢請求的緩存時間(秒),即在這個時間段里,對于相同的跨域請求不會再預檢了 config.addAllowedMethod("*");// 允許提交請求的方法,*表示全部允許 source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
zuul yml配置
zuul: #需要忽略的頭部信息,不在傳播到其他服務 sensitive-headers: Access-Control-Allow-Origin ignored-headers: Access-Control-Allow-Origin,H-App-Id,Token,APPToken max: host: connections: 5000 #最大請求時間 host: #等待 socket-timeout-millis: 60000 connect-timeout-millis: 60000