SpringBoot实战电商项目mall(25k+star)地址:github.com/macrozheng/…前端
随着项目架构的愈来愈复杂,引入了新的技术,新的问题也在产生,本文将讲述一个因为网关引发的前端调用问题。java
个人mall
项目升级到微服务架构之后,加入了基于Spring Cloud Gateway的网关系统,前端调用相关服务时应该统一从网关进行调用,本觉得前端直接调用网关没啥问题,后来发现会产生没法调用的状况,下面咱们来记录下这个问题以及解决思路。git
这里咱们以
mall-swarm
中的代码为例来演示下该问题的产生与解决。github
首先咱们先把mall-registry
、mall-config
、mall-gateway
、mall-admin
这些服务依次启动起来;web
再启动前端项目mall-admin-web
;跨域
访问登陆页面进行登陆操做,发现没法登陆,OPTIONS
请求返回状态码403
,到此咱们还看不来是啥问题;cookie
Console
来看看到底报了啥错,发现了CORS
这个关键信息,能够肯定是产生了跨域问题,网关没有支持跨域;mall-gateway
中添加全局跨域配置便可:/** * 全局跨域配置 * 注意:前端从网关进行调用时须要配置 * Created by macro on 2019/7/27. */
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
复制代码
mall-gateway
服务,再次进行登陆操做,发现OPTIONS
请求虽然经过了,可是POST
请求在Console
中却报错了:mall-admin
服务中重复设置了容许跨域的过滤器的问题,只要去除mall-admin
的全局跨域配置便可;/** * 全局跨域配置 * 注意:前端从网关进行调用时不须要配置 * Created by macro on 2019/7/27. */
//@Configuration
public class GlobalCorsConfig {
/** * 容许跨域调用的过滤器 */
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
//容许全部域名进行跨域调用
config.addAllowedOrigin("*");
//容许跨愈加送cookie
config.setAllowCredentials(true);
//放行所有原始头信息
config.addAllowedHeader("*");
//容许全部请求方法跨域调用
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
复制代码
mall-admin
服务后,发现已经能够正常登陆了。当前端应用经过网关调用服务时会产生跨域问题,解决方法是在网关服务中进行全局跨域配置,同时相关服务中若是有跨域配置应该去除。架构
mall项目全套学习教程连载中,关注公众号第一时间获取。微服务