跨域配置与两种解决方法

时间:2024-01-27 19:25:49

跨域配置与两种解决方法

跨域问题出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

CORS 是跨域资源分享(Cross-Origin Resource Sharing)的缩写。它是 W3C 标准,属于跨源 AJAX 请求的根本解决方法。

1 两种跨域解决方法

当web项目仅部署在Tomcat等服务器时,我们可以添加Java跨域配置;假设项目采用了Nginx,跨域任务可以交给Nginx。

1.1 Nginx跨域配置

完整的Nginx跨域配置示例

server {
    listen 3002;
    server_name localhost;

    location /hello {
    
    # 指定允许跨域的方法,*代表所有,也可设置具体方法。
        add_header Access-Control-Allow-Methods $http_access_control_request_method;
    
    # 预检命令的缓存,如果不缓存每次会发送两次请求
        add_header Access-Control-Max-Age 3600;
    
    # 带cookie请求需要加上这个字段,并设置为true
        add_header Access-Control-Allow-Credentials true;
    
    # 表示允许这个域跨域调用(客户端发送请求的域名和端口) 
    # $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号
        add_header Access-Control-Allow-Origin $http_origin;
    
    # 表示请求头的字段 动态获取
        add_header Access-Control-Allow-Headers $http_access_control_request_headers;
    
    # OPTIONS预检命令,预检命令通过时才发送请求
    # 检查请求的类型是不是预检命令
        if ($request_method = OPTIONS){
            return 200;
        }
    }
}

1.2 SpringBoot 跨域配置注册

原理与nignx相同,修改请求信息。 本类作为一个bean装载到spring容器中。

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        // Cors配置
        CorsConfiguration config = new CorsConfiguration();
        // 1. 设置请求域名
        config.addAllowedOrigin("http://localhost:8080"); // 本地ip
        config.addAllowedOrigin("http://192.168.233.130:8080"); // 虚拟机
        config.addAllowedOrigin("http://49.232.170.99"); // 外网ip
        config.addAllowedOrigin("*"); // 任意

        // 2. 设置允许的header
        config.addAllowedHeader("*");

        // 3. 设置允许请求的方法
        config.addAllowedMethod("*");

        // 4. 设置是否发送cookie
        config.setAllowCredentials(true);

        // 为URL添加路由
        UrlBasedCorsConfigurationSource corsSource = new UrlBasedCorsConfigurationSource();
        corsSource.registerCorsConfiguration("/**", config);

        return new CorsFilter(corsSource);
    }
}