问题出现:浏览器阻止跨域请求
原因 :浏览器不能执行其他网站的脚本,他是由于浏览器的同源策略造成的是浏览器对javascript施加的安全限制。
同源策略:是指协议域名端口都要相同,有一个不相同都会产生跨域问题
跨域请求的流程
非简单请求(PUT,DELETE等)需要先发送预检请求
问题解决
1.使用nginx将项目部署到同一域中(目的为解决项目问题,这里不做详解)
配置请求允许跨域
在分布式应用中配置请求允许跨域
分布式项目中用到跨域非常多,所以我们这里将跨域配置在gateway网关中。
springboot为我们提供了CorsWebFilter来解决跨域问题我们只需要将CorsWebFilter组件自定义并且注入到容器中即可解决跨域问题(快速搭建的脚手架工程renren-fast中配置了跨域信息我们将其注释)
@Configuration
public class WwmallCorsConfiguration {
@Bean
public CorsWebFilter corsWebFilter(){
UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration =new CorsConfiguration();
//允许哪些头跨域
corsConfiguration.addAllowedHeader("*");
//允许哪些方法跨域
corsConfiguration.addAllowedMethod("*");
//允许那些请求来源跨域
corsConfiguration.addAllowedOrigin("*");
//设置是否允许携带cookie跨域,否则跨域会丢失cookie信息
corsConfiguration.setAllowCredentials(true);
corsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(corsConfigurationSource);
}
}
配置完成后问题出现
因为网关将我们的请求转到/wwmall-product的地址与预期不一,
而我们预期的访问地址应该为http://localhost:8080/wwmall-product/category/list/tree
解决方法
网关配置路由重写访问地址(注意断言的优先级,一旦匹配后立即返回)