首页 > 其他分享 >全网最全的跨域解决方式

全网最全的跨域解决方式

时间:2025-01-21 18:59:12浏览次数:3  
标签:http CrossOrigin 最全 全网 Nginx proxy CORS 跨域

文章目录

一.跨域

什么是跨域?浏览器为了用户的安全,仅允许向 同域名、同端口 的服务器发送请求。

二.CORS

CORS(Cross-Origin Resource Sharing)是跨域资源共享的缩写,是一种机制,使用额外的HTTP头来告诉浏览器允许一个网页从另一个域请求资源,从而实现服务器和客户端之间的安全跨域通信‌。‌

CORS是一种机制,用于允许跨域请求。在Web应用程序中,由于浏览器的同源策略(Same-Origin Policy),浏览器会限制从一个源(域、协议、端口)发起的HTTP请求,只能访问同一源上的资源。CORS通过在服务器端和客户端之间添加一些额外的HTTP头信息,来解决跨域问题。在Spring Boot中,我们可以使用CORS配置来设置允许跨域访问的规则。

三.如何解决跨域

3.1 nginx

3.1.1 Nginx 解决跨域原理

  1. 跨域问题的原因 跨域问题是由浏览器的 同源策略(Same-Origin Policy) 引起的。同源策略要求: 协议、域名、端口都必须一致。 如果前端和后端运行在不同的域名、IP 或端口上,例如: 前端地址为 http://126.4.3.3 后端地址为 http://126.4.3.3:8080 浏览器会认为它们是不同源,因此会阻止请求,这是跨域问题的本质。
  2. 如何解决跨域问题的配置逻辑 Nginx 配置中,location /api 是关键:
location /api {
    proxy_pass http://127.0.0.1:后端端口;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_buffering off;
    proxy_set_header Connection "";
}

这里通过 Nginx 的反向代理机制: 将前端通过 /api 路径发起的请求转发到后端(即 http://127.0.0.1:后端端口 )。 对于前端来说,请求的域名和端口仍然是 http://126.4.3.3 ,从浏览器的角度看,请求是同源的。

3.1.2 解决跨域方式

前端

前端请求地址和前端运行地址一致 也就是前端 baseURL 请求 192.168.196.158:8000 具体参考自己运行地址。

后端

需要修改宝塔具体位置

server
{
    listen 80;
    server_name 前端 IP 比如 126.4.3.3;
    root 前端路径;

    location /api {
      proxy_pass  http://127.0.0.1:后端端口;
      proxy_set_header Host $proxy_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_buffering off;
      proxy_set_header Connection "";
    }


    # 这个要写在下面!
    location / {
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}


BUG

比如,下面这种情况:

所以会导致跨域失败!

解决方法:前端的 baseUrl 前端运行地址

3.2 修改后端服务

3.2.1 配置 @CrossOrigin ]注解

3.2.1.1 controller方法的CORS配置

你可以向@RequestMapping注解处理程序方法添加一个@CrossOrigin注解,以便启用CORS(默认情况下,@CrossOrigin允许在@RequestMapping注解中指定的所有源和HTTP方法):

@RestController
@RequestMapping("/account")
public class AccountController {
 
    @CrossOrigin
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }
 
    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

其中@CrossOrigin中的2个参数:

  • origins: 允许可访问的域列表
  • maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。
3.2.1.2 为整个controller启用@CrossOrigin
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
 
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }
 
    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

在这个例子中,对于retrieve()和remove()处理方法都启用了跨域支持,还可以看到如何使用@CrossOrigin属性定制CORS配置。

3.1.2.3 同时使用controller和方法级别的CORS配置

Spring将合并两个注释属性以创建合并的CORS配置。

3.2.2 全局CORS配置

@Configuration
public class WebMvcConfg implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //设置允许跨域的路径
        registry.addMapping("/**")
            //设置允许跨域请求的域名
            //当**Credentials为true时,**Origin不能为星号,需为具体的ip地址【如果接口不带cookie,ip无需设成具体ip】
            .allowedOrigins("http://localhost:9527", "http://127.0.0.1:9527", "http://127.0.0.1:8082", "http://127.0.0.1:8083")
            //是否允许证书 不再默认开启
            .allowCredentials(true)
            //设置允许的方法
            .allowedMethods("*")
            //跨域允许时间
            .maxAge(3600);
    }
}

模版

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

上述代码中,我们创建了一个名为CorsConfig的配置类,并实现了WebMvcConfigurer接口。在addCorsMappings方法中,我们使用CorsRegistry对象配置了CORS允许的规则。具体而言,我们允许所有的来源(allowedOrigins("*"))、所有的HTTP方法(allowedMethods("*"))、所有的请求头(allowedHeaders("*"))、允许携带身份凭证(allowCredentials(true))并设置了缓存时间(maxAge(3600))。

四. 注意

  1. 直接请求后端端口,那么 Nginx 就失去了反向代理的意义。
  2. 后端配置文件如果写了 samesite 或者 sercure 属性要删除掉!

  1. 后端写了跨域配置要 删除/注释 一般是 @CrossOrigin 或者 CrosConfig
  2. 前端使用域名,但是前端后端使用 ip ,导致 session 设置不上。

解决:前后端统一,要用域名都用域名、IP 都用 IP。

  1. 用 Nginx 跨域就不需要用 Nginx 跨域就不需要,跨域方式不能共存。
  2. 我们现在无法通过浏览器访问接口文档:http://81.69.229.63:8123/api/doc.html。这是因为我们的服务器防火墙没有放开 8123 端口。这里我们故意不放开,因为在之前的部署规划中,后端需要通过 Nginx 进行转发,从而解决跨域问题。

五.小结

几种后端解决跨域的方法:

1)设置 CORS 响应头:后端可以在 HTTP 响应头中添加相关的 CORS 标头,允许特定的源(域名、协议、端口)访问资源。Spring Boot 项目中,可以通过配置 CorsFilter Bean 或者 Web 拦截器(实现 WebMvcConfigurer 接口)实现,不依赖第三方服务。

2)使用代理服务器:可以使用 Nginx 反向代理,通过 add_header 给后端响应添加 Access-Control-Allow-Origin 头,不改代码实现跨域。

3)@CrossOrigin 注解:Spring Boot 项目可以直接在对应的 Controller 或接口方法上添加 @CrossOrigin 注解实现跨域,但这种方式对代码的侵入性较大。

onfigurer 接口)实现,不依赖第三方服务。

2)使用代理服务器:可以使用 Nginx 反向代理,通过 add_header 给后端响应添加 Access-Control-Allow-Origin 头,不改代码实现跨域。

3)@CrossOrigin 注解:Spring Boot 项目可以直接在对应的 Controller 或接口方法上添加 @CrossOrigin 注解实现跨域,但这种方式对代码的侵入性较大。

2)使用代理服务器,不需要考虑特定的后端接口实现代码,是一种更通用的解决跨域的方法。

标签:http,CrossOrigin,最全,全网,Nginx,proxy,CORS,跨域
From: https://blog.csdn.net/weixin_69912448/article/details/145269787

相关文章

  • 「全网最细 + 实战源码案例」设计模式——六大设计原则
    目的提高软件系统的可维护性和可复用性,增加软件的可拓展性和灵活性,程序员遵循6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。开闭原则(OCP)核心思想1.对拓展开放软件模块应该在不修改原有代码的情况下,通过扩展的方式增加新功能。目标:提高系统的可......
  • 「全网最细 + 实战源码案例」设计模式——单例设计模式
    核心思想:属于创建型设计模式,核心目的是确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来获取该实例。控制共享资源的访问(如数据库链接、配置管理、日志处理器等)真实世界类比:政府是单例模式的一个很好的示例。一个国家只有一个官方政府。不管组成政府的每个......
  • python安装、vscode安装、conda安装:一文搞定Python的开发环境(史上最全)
    本文原文链接文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完......
  • 主框架如何与iframe通信?如何解决跨域?
    主框架与iframe之间的通信以及跨域问题的解决在前端开发中是一个常见的需求。以下是一些方法和步骤来实现这一目标:一、主框架与iframe通信使用postMessage方法:主框架向iframe发送消息:可以通过获取iframe的contentWindow对象,并调用其postMessage方法来发送消息。例如:iframe.c......
  • 【大模型面试】常见问题及答案,一文搞定面试准备!2025年大模型最新最全面试题,助你吊打面
    大模型相关的面试问题通常涉及模型的原理、应用、优化以及面试者对于该领域的理解和经验。以下是一些常见的大模型面试问题以及建议的回答方式:请简述什么是大模型,以及它与传统模型的主要区别是什么?回答:大模型通常指的是参数数量巨大的深度学习模型,如GPT系列。它们与传统模......
  • C转C++最全指南
    1.了解C与C++的关系C++是C语言的超集,意味着所有C语言代码在C++中都有效,但C++引入了更多的特性。C++是面向对象的编程语言,而C语言是过程化编程语言。2.基本语法与数据类型变量声明与初始化:C:inta=10;C++:支持类和对象的构造函数、重载等特性。inta=10;输入输......
  • 手把手教你完成YOLOv11 PySide6目标检测界面搭建,使用Qt6设计YOLOv11检测系统,实现图片
    摘要目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。YOLO系列模型由于其高效的检测速度和较高的准确率,成为目标检测任务的首选算法之一。本项目结合YOLOv11与PySide6,构建了一个图形化界面,便于用户进行目标检测的操作和展示,实现对图片......
  • 酷炫抽奖平台 | 全网最美的年会抽奖源码合集(附源码)
    文章目录前言一、......
  • CentOS等各类Linux系统安装配置Docker详细教程(全网最详细,步骤简洁,看完包懂)
    文章目录前言详细步骤1.安装相关依赖2.安装阿里云的DockerGPG密钥3.设置stable仓库4.安装Docker5.启动服务6.验证测试常见问题及对应解决方案补充1.Ubuntu等系统配置Docker详细教程CentOS9配置Docker-速通版前言Docker是一个非常常用的工具,但是由于其涉及......
  • 第3.5.1章 Ceres库最全总结及在机器人SLAM方面的项目应用实例
    以下是关于Ceres库的详细介绍:目录Ceres库的用途Ceres库头文件分类及应用场景Ceres库头文件中函数和类的用法及代码实例机器人SLAM方面的项目应用实例及高频函数和类Ceres库的用途Ceres库是一个开源的C++库,主要用于解决非线性最小二乘问题。它提供了一种灵活且高效......