跨域问题是什么:前端向后端传数据是用的Ajax,当页面发起了Ajax请求,这个请求要传达的路径只能是和当前页面的域名相同,这能有效的阻止跨站攻击,但是又限制了不同域名之间的访问从而导致了跨域问题。跨域问题是浏览器对Ajax请求的一种安全限制。
导致跨域问题(域名不同)的具体细节:
1、协议不同。http,https这些。
2、ip地址不同。
3、端口号不同。
~~ 由此可以看出跨域问题在实际生产环境中多么需要重视。
解决方案呢,也可以是多种,但是不同的解决方案也有不同的优点和弊端。不好使的我会标注出来,提几个常用的。
方式一(推荐):Gateway配置类 在Gateway微服务下,可以新增一个配置类,也可以在启动类里添加,反正启动类也是一个配置文件嘛。二择一即可。
* 跨域配置类
*/
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsWebFilter(){
// cors跨域配置对象
CorsConfiguration configuration = new CorsConfiguration();
configuration.addAllowedOrigin("*"); //设置允许访问的网络
configuration.setAllowCredentials(true); // 设置是否从服务器获取cookie
configuration.addAllowedMethod("*"); // 设置请求方法 * 表示所有
configuration.addAllowedHeader("*"); // 所有请求头信息 * 表示所有
// 配置源对象
UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource();
configurationSource.registerCorsConfiguration("/**", configuration);
// cors过滤器对象
return new CorsWebFilter(configurationSource);
}
}
方式二(不推荐):配置文件新增配置
在Gateway微服务的配置文件新增配置
server:
port: 80
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: 192.168.200.128:8848
gateway:
discovery: #是否与服务发现组件进行结合,通过 serviceId(必须设置成大写) 转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能。
locator: #路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问。
enabled: true
globalcors:
cors-configurations:
'[/**]': # 匹配所有请求
allowedOrigins: "*" #跨域处理 允许所有的域
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
方式三:添加注解。
在所有的controller类上加一个注解@CrossOrigin。
疯了?
闲得慌吗。
还有其他方式,都不怎么常见。