跨域问题

184 阅读2分钟

跨域问题是什么:前端向后端传数据是用的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。
疯了?
闲得慌吗。

还有其他方式,都不怎么常见。