什么是javascript跨域请求_CORS和JSONP有什么区别?

发布时间 - 2025-12-25 00:00:00    点击率:
JavaScript跨域请求受同源策略限制,CORS是服务端配置响应头的标准方案,支持所有HTTP方法及凭证;JSONP是客户端利用script标签的兼容方案,仅支持GET且存XSS风险。

JavaScript跨域请求,本质是浏览器出于安全考虑实施的同源策略限制:当页面脚本试图向非同源(协议、域名、端口任一不同)的服务器发起请求时,XMLHttpRequest 或 fetch 默认被拦截。要突破这个限制,CORS 和 JSONP 是两种典型方案,但原理、能力与适用场景差异明显。

CORS 是服务端驱动的标准方案

CORS(Cross-Origin Resource Sharing)是 W3C 标准,依赖服务器在响应头中明确声明允许哪些源访问资源。浏览器自动处理整个流程,开发者调用 fetch 或 XMLHttpRequest 的方式和同源请求完全一样。

  • 支持所有 HTTP 方法(GET、POST、PUT、DELETE 等),可传 Cookie(需设置 withCredentials: true 并服务端配 Access-Control-Allow-Credentials: true
  • 简单请求(如 GET/POST + 纯文本 Content-Type)直接发送;复杂请求(如带自定义 header 或 Content-Type: application/json)会先发 OPTIONS 预检请求
  • 服务端必须配置关键响应头,例如:
    Access-Control-Allow-Origin(指定允许的源,不能为 * 时配合 credentials)
    Access-Control-Allow-Methods
    Access-Control-Allow-Headers
  • 现代浏览器全支持(IE10+),错误可捕获、调试信息清晰

JSONP 是客户端绕过的兼容性方案

JSONP 不是标准协议,而是利用 标签不受同源策略限制的特性,通过动态插入 script 请求一个返回函数调用的 JS 脚本,实现数据“填充”(Padding)式加载。

  • 只支持 GET 请求,无法发送 POST 或携带认证凭证
  • 客户端需定义全局回调函数(如 callbackFunc),并将函数名作为 URL 参数(如 callback=callbackFunc)传给服务端
  • 服务端必须配合,把 JSON 数据包裹进该函数调用中返回,例如:
    callbackFunc({"name": "张三"})
  • 无预检开销,但错误难监听(script 加载失败不会触发 onerror 回调,仅靠 timeout 模拟)
  • 存在 XSS 风险:若 callback 参数未校验,可能执行恶意代码;且无法限制响应内容类型

选哪个?看实际约束条件

如果能控制服务端,优先用 CORS —— 它更规范、功能完整、安全性更高,也符合现代开发实践。JSONP 仅在两类场景仍有价值:需兼容 IE9 及更老浏览器;或调用第三方 API(如某些老地图接口)只提供 JSONP 接口且不支持 CORS。

注意:两者都不是前端单方面能搞定的方案。CORS 关键在服务端响应头;JSONP 关键在服务端按约定格式返回 JS 调用。缺少任一端配合,都无法生效。


# javascript  # java  # js  # 前端  # json  # cookie  # 浏览器  # app  # access  # 回调函数  # 端口  # 跨域 


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


相关推荐: 西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel怎么调用外部API_Laravel Http Client客户端使用  如何在IIS中新建站点并配置端口与IP地址?  如何快速完成中国万网建站详细流程?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  详解Oracle修改字段类型方法总结  高端建站三要素:定制模板、企业官网与响应式设计优化  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Laravel如何处理表单验证?(Requests代码示例)  如何快速重置建站主机并恢复默认配置?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何打造高效商业网站?建站目的决定转化率  敲碗10年!Mac系列传将迎来「触控与联网」双革新  php 三元运算符实例详细介绍  如何在阿里云高效完成企业建站全流程?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  黑客如何通过漏洞一步步攻陷网站服务器?  QQ浏览器网页版登录入口 个人中心在线进入  如何快速查询网址的建站时间与历史轨迹?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  PHP正则匹配日期和时间(时间戳转换)的实例代码  进行网站优化必须要坚持的四大原则  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel如何创建自定义Artisan命令?(代码示例)  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  如何快速登录WAP自助建站平台?  Swift中swift中的switch 语句  如何在企业微信快速生成手机电脑官网?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  昵图网官方站入口 昵图网素材图库官网入口  香港服务器选型指南:免备案配置与高效建站方案解析  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  智能起名网站制作软件有哪些,制作logo的软件?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  如何快速生成可下载的建站源码工具?  Laravel怎么在Controller之外的地方验证数据  如何在万网利用已有域名快速建站?  网站制作企业,网站的banner和导航栏是指什么?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  SQL查询语句优化的实用方法总结  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  C#如何调用原生C++ COM对象详解  Python自动化办公教程_ExcelWordPDF批量处理案例