一、跨域的由来
为了保证用户信息的安全,防止恶意的网站窃取数据,目前,所有浏览器都实行了同源策略,要求域名、协议、端口必须都相同才属于同源,只有同源才可以访问其他页面的对象,否则将受到以下限制:
(1) Cookie、LocalStorage 和 IndexDB 无法读取。
(2) DOM 无法获得。
(3) AJAX 请求不能发送。
二、微服务之后跨域问题更普遍存在
在现在前后端分离,分布式服务、微服务化之后,我们将复杂的业务拆分成细小的服务组件,部署到不同的主机下,往往存在不同的域名。因此,跨域问题,就更普遍存在了。
三、跨域问题解决方法--通过 CORS 实现跨域
分布式项目中,添加配置类:GlobalCorsConfig
1 package cn.itsource.hrm.config; 2 3 import org.springframework.context.annotation.Bean; 4 import org.springframework.context.annotation.Configuration; 5 import org.springframework.web.cors.CorsConfiguration; 6 import org.springframework.web.cors.UrlBasedCorsConfigurationSource; 7 import org.springframework.web.filter.CorsFilter; 8 9 @Configuration 10 public class GlobalCorsConfig { 11 @Bean 12 public CorsFilter corsFilter() { 13 //1.添加CORS配置信息 14 CorsConfiguration config = new CorsConfiguration(); 15 //1) 允许的域,不要写*,否则cookie就无法使用了 16 config.addAllowedOrigin("http://127.0.0.1:6001"); 17 config.addAllowedOrigin("http://localhost:6001"); 18 config.addAllowedOrigin("http://localhost:6002"); 19 config.addAllowedOrigin("http://127.0.0.1:6002"); 20 config.addAllowedOrigin("http://localhost:6003"); 21 config.addAllowedOrigin("http://127.0.0.1:6003"); 22 //2) 是否发送Cookie信息 23 config.setAllowCredentials(true); 24 //3) 允许的请求方式 25 config.addAllowedMethod("OPTIONS"); 26 config.addAllowedMethod("HEAD"); 27 config.addAllowedMethod("GET"); 28 config.addAllowedMethod("PUT"); 29 config.addAllowedMethod("POST"); 30 config.addAllowedMethod("DELETE"); 31 config.addAllowedMethod("PATCH"); 32 // 4)允许的头信息 33 config.addAllowedHeader("*"); 34 //2.添加映射路径,我们拦截一切请求 35 UrlBasedCorsConfigurationSource configSource = new 36 UrlBasedCorsConfigurationSource(); 37 configSource.registerCorsConfiguration("/**", config); 38 //3.返回新的CorsFilter. 39 return new CorsFilter(configSource); 40 } 41 }