一、什么是跨域
前端頁面與后臺服務必須同源,即協議,域名,端口都要相同,其中有一個不同都會產生跨域;
如下圖,加深理解
二、解決方案
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






