当前位置: 首页 > news >正文

跨域问题解决方法

跨域问题是由于浏览器的同源策略(Same-Origin Policy)导致的,它限制了不同源(协议、域名、端口任一不同)的资源交互。以下是常见解决方案,按优先级排序:


一、主流解决方案

1. CORS(跨域资源共享) ⭐️ 最推荐
  • 原理:服务端设置响应头声明允许跨域。
  • 实现
    // 服务端响应头示例(以 Node.js 为例)
    Access-Control-Allow-Origin: *       // 允许所有域名(* 生产环境慎用)
    Access-Control-Allow-Origin: https://your-frontend.com // 指定域名
    Access-Control-Allow-Methods: GET,POST,PUT // 允许的请求方法
    Access-Control-Allow-Headers: Content-Type,Authorization // 允许的请求头
    
  • 需预检的请求(如带自定义头或非简单请求):需处理 OPTIONS 预检请求。
2. 代理服务器(Proxy) ⭐️ 前端开发常用
  • 原理:让同源服务器中转请求(浏览器→同源服务器→目标服务器)。
  • 实现
    • 开发环境:用 webpack-dev-server / Vite 代理:
      // vite.config.js
      export default {server: {proxy: {'/api': {target: 'http://api.example.com', // 目标服务器changeOrigin: true,               // 修改请求头 Hostrewrite: path => path.replace(/^\/api/, '') // 路径重写}}}
      }
      
    • 生产环境:用 Nginx 反向代理:
      location /api/ {proxy_pass http://api.example.com/; # 转发到目标服务器add_header Access-Control-Allow-Origin *; # 可选,双重保障
      }
      

二、特殊场景方案

3. JSONP(仅限 GET 请求)
  • 原理:利用 <script> 标签不受同源策略限制的特性。
  • 实现
    <!-- 前端 -->
    <script>function handleResponse(data) {console.log("收到数据:", data);}
    </script>
    <script src="http://api.com/data?callback=handleResponse"></script>
    
    // 服务端返回(需支持 JSONP)
    handleResponse({ "data": "example" });
    
4. WebSocket
  • 原理:WebSocket 协议本身支持跨域。
  • 实现
    const socket = new WebSocket("ws://api.example.com");
    socket.onmessage = event => console.log(event.data);
    
5. 修改 document.domain(仅限子域跨域)
  • 场景a.example.comb.example.com 通信。
  • 实现
    // 在两个页面中均设置
    document.domain = "example.com"; // 降域到同一父域
    

三、其他注意事项

  1. 携带 Cookie 的跨域请求

    • 前端设置:fetch(url, { credentials: 'include' })
    • 服务端需设置:Access-Control-Allow-Credentials: true
      Access-Control-Allow-Origin 不能为 *,必须指定域名。
  2. 避免跨域的替代方案

    • 将前后端部署在同一域名下(如前端 example.com,后端 api.example.com 通过 Nginx 合并域名)。

总结选择

场景推荐方案
可控的服务端CORS
前端开发调试本地代理(webpack/Vite)
生产环境前后端分离Nginx 代理
仅需 GET 请求的旧系统兼容JSONP
实时双向通信(如聊天室)WebSocket

优先使用 CORS代理,其他方案作为特殊场景备选。

http://www.lryc.cn/news/626423.html

相关文章:

  • 三分钟速通SSH登录
  • IDEA:控制台中文乱码
  • IDEA切换分支时,提示:Git Checkout Problem
  • 用通俗易懂的语言解释前后端分离和不分离的区别及其优缺点
  • 【Java】深入浅出Spring中的@Autowired:自动注入的奥秘
  • 【数据结构】直接选择排序
  • 九、Java类核心语法:构造器、this、封装与static详解
  • rsync 工具
  • Linux 文本处理三剑客:awk、grep、sed 完全指南
  • Redis 安装教程
  • Linux的i节点(inode) 和 数据块(Block)相关操作详解
  • 中小型企业是否需要使用高防服务器
  • 服务器硬件电路设计之 SPI 问答(三):SPI 信号完整性守护与时钟频率的硬件设计羁绊
  • 阿里云ECS服务器的公网IP地址
  • 服务器硬件电路设计之 SPI 问答(一):解密 SPI—— 从定义到核心特性
  • 对称加密算法
  • TDengine IDMP 运维指南(数据导入导出)
  • AI大模型×政务热线:数造科技打造企业动态画像的“实时监测引擎”
  • 【自记】Power BI 中 DISTINCT 和 ALLNOBLANKROW 的区别说明
  • Java:将视频上传到腾讯云并通过腾讯云点播播放
  • 通过uniapp将vite vue3项目打包为android系统的.apk包,并实现可自动升级功能
  • 【考研408数据结构-04】 栈与队列:受限的线性表
  • CentOS7.9中安装Harbor以及配置https
  • 【Linux】系统部分——磁盘存储结构与文件系统
  • 初试Docker Desktop工具
  • 如何能成功在centos7下安装nodejs18+以上版本
  • TDengine IDMP 运维指南(5. 使用 Helm 部署)
  • 不止效率工具:AI 在创意领域的 “叛逆生长”—— 从文案生成到艺术创作的突围
  • 关于AKShare接口数据,快速查询命令大全
  • 从基础到本质:文件 IO 操作全解析