什么是跨域请求_JavaScript中如何解决跨域问题

发布时间 - 2026-01-05 00:00:00    点击率:
跨域请求被浏览器同源策略拦截,服务端实际已接收并响应;CORS预检失败因后端未正确配置Access-Control-Allow-Origin等响应头;开发可配vite/webpack代理临时解决,JSONP已淘汰。

跨域请求不是“不安全所以被禁”,而是浏览器出于同源策略(Same-Origin Policy)主动拦截了 JavaScript 发起的跨域 XMLHttpRequestfetch 请求——服务端其实完全收到了请求,也正常返回了响应,但浏览器拒绝把响应内容交给 JS 脚本。

为什么 fetch 会报 “No 'Access-Control-Allow-Origin' header” 错误

这是典型的 CORS(Cross-Origin Resource Sharing)预检失败提示。浏览器在发送某些“非简单请求”(如带 Content-Type: application/json、自定义 header、PUT/DELETE 方法)前,会先发一个 OPTIONS 预检请求。如果后端没正确响应这个 OPTIONS,或者没返回必需的 CORS 头,fetch 就会直接报错,连真正的请求都不会发出去。

  • 必须由后端设置响应头:Access-Control-Allow-Origin(不能是通配符 * + 凭据)
  • 若前端带 credentials: 'include',后端还必须加:Access-Control-Allow-Credentials: true
  • 预检请求要求后端对 OPTIONS 返回 200,并带上 Access-Control-Allow-MethodsAccess-Control-Allow-Headers

前端临时绕过:开发环境用 webpack/vite 代理

代理只在开发服务器生效,不解决生产跨域,但能立刻让接口调通,避免反复改后端配置。

  • vite:在 vite.config.ts 中配 server.proxy,例如将 /api 代理到 http://localhost:3000
  • webpack-dev-server:在 devServer.proxy 中写对象或数组规则,注意路径重写(rewritepathRewrite 已废弃,改用 configure 函数)
  • 关键点:代理目标地址不能带结尾斜杠(target: 'http://localhost:3000' ✅,'http://localhost:3000/' ❌),否则路径拼接错

JSONP 已淘汰,不要在新项目中使用

JSONP 利用 标签不受同源限制的特性,通过动态插入 script 加载远程 JS 执行回调。但它只支持 GET,没有错误捕获机制,无法设 timeout,且服务端必须配合返回函数调用格式(如 callback({...}))。现代浏览器已弃用 document.write,主流框架也不再内置 JSONP 支持。

立即学习“Java免费学习笔记(深入)”;

  • 如果你看到老代码里还有 $.getJSON(url + '?callback=?') 或手动创建 script 标签,说明它没走 CORS,而是降级到了 JSONP
  • Chrome 98+ 对 document.write 在非初始页面加载时直接静默忽略,JSONP 回调可能永远不执行
  • 真正需要兼容 IE10 及以下?优先考虑后端加 CORS,而不是复活 JSONP
fetch('/api/user', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  credentials: 'include',
  body: JSON.stringify({ id: 123 })
})
  .then(r => r.json())
  .catch(err => console.error('网络或 CORS 失败:', err))

CORS 的核心从来不在前端“怎么发”,而在于后端是否明确声明“允许谁、用什么方法、带什么头来访问我”。很多前端开发者卡在“为什么本地能通上线就跨域”,往往是因为 nginx 或云函数网关没透传后端返回的 CORS 响应头,或者反向代理覆盖了它们。


# javascript  # java  # js  # 前端  # json  # vite  # nginx  # 浏览器  # app  # access  # 后端  # 前端开发 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何确保西部建站助手FTP传输的安全性?  教你用AI润色文章,让你的文字表达更专业  Android实现代码画虚线边框背景效果  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何挑选高效建站主机与优质域名?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何在Tomcat中配置并部署网站项目?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Linux后台任务运行方法_nohup与&使用技巧【技巧】  如何批量查询域名的建站时间记录?  Laravel如何创建自定义Artisan命令?(代码示例)  如何快速生成专业多端适配建站电话?  Laravel如何自定义分页视图?(Pagination示例)  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  如何获取PHP WAP自助建站系统源码?  如何在香港免费服务器上快速搭建网站?  原生JS实现图片轮播切换效果  利用python获取某年中每个月的第一天和最后一天  高端建站如何打造兼具美学与转化的品牌官网?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  浅谈javascript alert和confirm的美化  浅述节点的创建及常见功能的实现  微信小程序 wx.uploadFile无法上传解决办法  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  济南网站建设制作公司,室内设计网站一般都有哪些功能?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何快速查询网址的建站时间与历史轨迹?  如何在建站之星绑定自定义域名?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  奇安信“盘古石”团队突破 iOS 26.1 提权  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  网站建设要注意的标准 促进网站用户好感度!  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  如何快速使用云服务器搭建个人网站?  HTML 中动态设置元素 name 属性的正确语法详解  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  如何在云主机快速搭建网站站点?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel怎么调用外部API_Laravel Http Client客户端使用  如何在 React 中条件性地遍历数组并渲染元素