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

跨域请求解决方案全解析

跨域请求可以通过多种技术方案实现,核心是绕过浏览器的同源策略限制。以下是主流解决方案及具体实现方式:


一、CORS(跨域资源共享)

最常用的标准化方案,通过服务器设置HTTP响应头实现:

Access-Control-Allow-Origin: *         // 允许所有域名访问(或指定域名如 https://example.com)
Access-Control-Allow-Methods: GET, POST, PUT  // 允许的请求方法
Access-Control-Allow-Headers: Content-Type    // 允许的请求头
Access-Control-Allow-Credentials: true        // 是否允许携带Cookie(需与前端withCredentials配合)

实现步骤

  1. 简单请求(GET/POST/HEAD且无自定义头)
    • 浏览器自动添加Origin头,服务器响应Access-Control-Allow-Origin即完成跨域。
  2. 复杂请求(如PUT/DELETE或带自定义头)
    • 浏览器先发送OPTIONS预检请求,服务器需响应上述头字段,通过后再发送实际请求。
      适用场景:RESTful API、前后端分离项目。

二、JSONP(JSON with Padding)

利用<script>标签不受同源策略限制的特性:

  1. 前端动态创建<script>标签,通过src传递回调函数名(如?callback=handleData)。
  2. 服务器返回JS代码:handleData({ "data": "value" })
  3. 前端定义handleData函数处理数据。
    特点
  • 仅支持GET请求
  • 需服务器配合返回JS代码而非纯JSON
  • 存在XSS风险,需确保来源可信。

三、反向代理

将跨域请求转发至同源代理服务器,由代理访问目标服务:

  1. 开发环境(如webpack/vite):
    // vite.config.js
    export default {server: {proxy: {'/api': {target: 'http://target-domain.com',changeOrigin: true  // 修改请求头Host为目标域名}}}
    }
    
  2. 生产环境(Nginx配置):
    location /api/ {proxy_pass http://target-domain.com/;  // 转发请求add_header Access-Control-Allow-Origin *; // 可选CORS头
    }
    

优势:前端无需修改代码,避免CORS配置复杂度。


四、其他方案

方案原理局限性
WebSocket建立全双工通信通道,无同源限制需服务端支持WS协议
postMessagewindow.postMessage()实现跨窗口通信(如iframe间)仅适用于窗口/iframe交互
document.domain强制设置相同父域(如a.example.comb.example.com均设document.domain='example.com'仅限主域相同子域不同的场景

五、选择建议

场景推荐方案
现代API接口CORS
兼容老旧浏览器JSONP
前端工程化项目(开发/生产)反向代理
跨域页面通信(如嵌入iframe)postMessage

安全提示

  • CORS避免使用Access-Control-Allow-Origin: *搭配敏感数据。
  • JSONP需防范XSS攻击,严格校验请求来源。
  • 带凭证请求(Cookie/Auth)时,CORS需设置Access-Control-Allow-Credentials: trueAllow-Origin不能为*

实际项目中,CORS与反向代理为最主流方案,兼顾安全性和易用性。

http://www.xdnf.cn/news/11884.html

相关文章:

  • NFT 市场开发:基于 Ethereum 和 IPFS 构建去中心化平台
  • Open SSL 3.0相关知识以及源码流程分析
  • 【定时器】定时器存在的内存泄露问题
  • [蓝桥杯]最大比例
  • springboot ErrorController getErrorPath() 版本变迁
  • Java设计模式:责任链模式
  • stress-ng 服务器压力测试的工具学习
  • .NET 原生驾驭 AI 新基建实战系列(三):Chroma ── 轻松构建智能应用的向量数据库
  • Orthanc:轻量级PACS服务器与DICOMweb支持的技术详解
  • 【unity游戏开发入门到精通——通用篇】从零掌握UnityWebRequest:文件下载、表单提交、超时处理、断点续传
  • UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
  • qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
  • Python_day44
  • 定制开发开源AI智能名片S2B2C商城小程序在无界零售中的应用与行业智能升级示范研究
  • NeRF PyTorch 源码解读 - NDC空间
  • AI,如何重构理解、匹配与决策?
  • FFmpeg avformat_open_input函数分析
  • [蓝桥杯]密文搜索
  • 深入解析 Java ClassLoader:揭开 JVM 动态加载的神秘面纱
  • CSP-J 信奥竞赛大纲(2025)
  • C语言-指针基础概念
  • 图神经网络实战——图属性度量方法详解
  • @Prometheus 监控-MySQL (Mysqld Exporter)
  • 【从GEO数据库批量下载数据】
  • docker生命周期
  • 结构性设计模式之Flyweight(享元)
  • Linux基本指令(三)
  • 【投稿优惠】2025年人工智能与图像处理国际会议(AIIP 2025)
  • 物联网协议之MQTT(一)基础概念和设备
  • 【Web应用】若依框架:基础篇14 源码阅读-后端代码分析