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

跨域——CORS详解

CORS(Cross-origin resource sharing) “跨域资源共享”

在出现CORS标准之前, 我们还只能通过jsonp(jsonp跨域请求详解)的形式去向“跨源”服务器去发送 XMLHttpRequest 请求,这种方式吃力不讨好,在请求方与接收方都需要做处理,而且请求的方式仅仅局限于GET。所以 ,CORS标准必然是大势所趋,并且市场上绝大多数浏览器都已经支持CORS。(IE10以上)


CORS概念

支持CORS请求的浏览器一旦发现ajax请求跨域,会对请求做一些特殊处理,对于已经实现CORS接口的服务端,接受请求,并做出回应。

有一种情况比较特殊,如果我们发送的跨域请求为“非简单请求”,浏览器会在发出此请求之前首先发送一个请求类型为OPTIONS的“预检请求”,验证请求源是否为服务端允许源,这些对于开发这来说是感觉不到的,由浏览器代理。

总而言之,客户端不需要对跨域请求做任何特殊处理。

简单请求与非简单请求

浏览器对跨域请求区分为“简单请求”与“非简单请求”

“简单请求”满足以下特征:

(1) 请求方法是以下三种方法之一:HEADGETPOST
(2)HTTP的头信息不超出以下几种字段:AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-Type:application/x-www-form-urlencoded、 multipart/form-data、text/plain

不满足这些特征的请求称为“非简单请求”,例如:content-type=applicaiton/json , method = PUT/DELETE...

简单请求

浏览器判断跨域为简单请求时候,会在Request Header中添加 Origin (协议 + 域名 + 端口)字段 , 它表示我们的请求源,CORS服务端会将该字段作为跨源标志。

 

CORS接收到此次请求后 , 首先会判断Origin是否在允许源(由服务端决定)范围之内,如果验证通过,服务端会在Response Header 添加 Access-Control-Allow-Origin、Access-Control-Allow-Credentials等字段。

 

必须字段Access-Control-Allow-Origin表示服务端允许的请求源*标识任何外域多个源 , 分隔可选字段
Access-Control-Allow-Credentialsfalse 表示是否允许发送Cookie设置为true同时ajax请求设置withCredentials = true,浏览器的cookie就能发送到服务端Access-Control-Expose-Headers调用getResponseHeader()方法时候能从header中获取的参数

浏览器收到Respnose后会判断自己的源是否存在 Access-Control-Allow-Origin允许源中,如果不存在,会抛出“同源检测异常”。

总结:简单请求只需要CORS服务端在接受到携带Origin字段的跨域请求后,在response header中添加Access-Control-Allow-Origin等字段给浏览器做同源判断。


非简单请求

进行非简单请求时候 , 浏览器会首先发出类型为OPTIONS的“预检请求”,请求地址相同 ,

CORS服务端对“预检请求”处理,并对Response Header添加验证字段,客户端接受到预检请求的返回值进行一次请求预判断,验证通过后,主请求发起。

例如:发起 content-type=application/json 的非简单请求,这时候传参要注意为json字符串

这里可以看到,浏览器连续发送了两个jsonp.do请求 , 第一个就是“预检请求”,类型为OPTIONS,因为我们设置了content-type这个属性,所以预检请求的Access-Control-Expose-Headers必须携带content-type,否则预检会失败。

预检通过后,主请求与简单请求一致。

总结:非简单请求需要CORS服务端对OPTIONS类型的请求做处理,其他与简单请求一致

http://www.hskmm.com/?act=detail&tid=597

相关文章:

  • 【EI-JA期刊同步征稿|武汉科技大学主办】第六届医学人工智能国际学术会议(ISAIMS 2025)
  • JBOSS CVE-2017-7504 反序列化漏洞
  • 搞机工具箱v11.0.0免Root调试安卓
  • 备战软考5
  • Gorm自定义数据类型
  • AI GEO领域发展机遇大
  • PHP流量控制令牌桶算法
  • TIA博图的三种视图
  • 数据结构与算法-21.优先队列
  • 顽固文件夹无法删除?
  • 普科科技 PKC7030 高频电流探头调零指南
  • 智能CRM赋能饮料行业:纷享销客快消品全场景数字化解决方案
  • c++ std::map
  • 调一调
  • 【稳定检索|线上线下参会|马理工主办】第十一届建筑、土木与水利工程国际学术会议(ICACHE 2025)
  • 软考架构备考-面向对象
  • 在AI技术快速实现创意的时代,挖掘真实需求成为核心竞争力——某知名实时语音转录系统需求洞察
  • 多版本jdk环境下,指定jdk版本执行jar文件
  • 【Python】Word文档解析表格并导出Excel
  • 海明码破解指南:从让人头疼的软考题到内存背后的无名英雄
  • 2025.9.9 总结
  • 基于Python+Vue开发的医院门诊预约挂号系统源码+运行
  • 2025 9 6 总结
  • 2025.9.8 总结
  • OLE读取EXCEL内容
  • 第5篇、 Kafka 数据可靠性与容错机制
  • Shell符号详解
  • Dynamics 365 CRM + Power Platform 技术顾问:解锁 IT 高薪赛道,长沙爱码士 IT 助你全程通关
  • Rope pbds
  • 295、嫦娥