一、 什么是跨域(同源策略)
同源的定義:如果兩個頁面的協議,端口(如果有指定)和主機都相同,則兩個頁面具有相同的源
1,用戶在瀏覽器輸入的URL中包含的協議、域名、端口都完全相同。如果有一項不同,瀏覽器會覺得有安全問題,從而產生跨域問題。,
2,如果使用Postman等開發工具進行交互是不會出現跨域問題,這是瀏覽器特有的限制。
在后端服務添加CORS策略的配置就可以解決跨域問題。
一,Spring Cloud Gateway 跨域配置?
spring: cloud:gateway:globalcors:cors-configurations:'[/**]': # 允許跨域的源(網站域名/ip),設置*為全部allow-credentials: trueallowed-origins: #起源- "http://xb.abc.com"- "http://sf.xx.com"allowed-headers: "*" # 允許跨域請求里的head字段,設置*為全部allowed-methods: # 允許跨域的method, 默認為GET和OPTIONS,設置*為全部- OPTIONS- GET- POST- DELETE- PUT- PATCHmax-age: 3600
二,Spring boot項目
1,使用@CrossOrigin注解 (局部跨域)
在支持跨域的方法或類上添加@CrossOrigin注解
@CrossOrigin(origins = "*")
2,重寫 WebMvcConfigurer(全局跨域)
?Spring boot項目更便捷的方式,實現WebMvcConfigurer接口中的addCorsMappings方法。
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")//放行哪些原始域.allowedOrigins("*").allowedHeaders("*")// 是否發送Cookie.allowCredentials(true).allowedMethods("GET", "POST", "OPTIONS", "DELETE", "PUT", "PATCH").maxAge(3600);}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}
}
三,反向代理服務器
使用反向代理服務器可以將前端請求轉發到后端服務器,從而繞過跨域限制。以下是反向代理服務器的示例代碼:
這里nginx是要和你的前端服務在一臺服務器上的,然后你訪問的時候通過前端的nginx進行轉發的后端服務器才行?
NGINX反向代理配置示例
location /api {proxy_pass http://backend-server;
}
?四,Spring解決跨越
添加處理跨域的過濾器(CoreFilter)。
@Configuration
public class GlobalCorsConfig {@Beanpublic CorsFilter corsFilter(){CorsConfiguration config=new CorsConfiguration();//config.addAllowedOrigin("*"); -過時的//允許哪些域名訪問config.addAllowedOriginPattern("*");//是否允許前端傳遞驗證信息 cookieconfig.setAllowCredentials(true);//允許所有的方法 POST GET ...config.addAllowedMethod("*");//允許哪些請求頭config.addAllowedHeader("*");//暴露哪些頭部信息config.addExposedHeader("*");//設置允許哪些接口可以被跨域訪問UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**",config);return new CorsFilter(source);}
}
?