CORS跨域问题

跨域问题简介

跨域资源共享(Cross-origin resource sharing, CORS)是用于让网站资源能被不同源网站访问的一种安全机制,这个机制由浏览器与服务器共同负责,浏览器在其中扮演最重要的角色。

同源

协议相同(httphttps)、域名相同、端口相同就是同源。

同源限制了B网站获取到非同源的A网站保存在浏览器的Cookie、LocalStorage、IndexDB、DOM、AJAX请求。当A网站的网页内有跨域请求且A网站后端并未添加跨域请求头,浏览器将拦截该跨域请求。

请求过程

当浏览器发出特定不安全的HTTP和Ajax请求时,CORS机制要求浏览器首先需要发送一个HTTP OPTIONS预检请求用于检查服务器是否批准来自该地址的请求并指定是否接收认证信息(例如Cookies等),浏览器将遵循服务器的限制正式请求的情况。出于安全考虑,如果跨域请求被拒绝,错误将只会返回到浏览器控制台内,JavaScript代码不会接收到错误信息。

不会触发OPTIONS预检请求的条件是:

  • 请求方法为GET、HEAD、POST
  • 请求头安全Accept、Accept-Language、Content-Language、Content-Type(仅限于text/plain、multipart/form-data、application/x-www-form-urlencoded)、DPR、Downlink、Save-Data、Viewport-Width、Width

不发出预检请求的例子

下面是一个不需要发送预检请求的从http://foo.example网站的网页或JavaScript访问http://bar.example请求的简化版,Origin请求头用于标志请求来源

GET /resources/public-data/ HTTP/1.1
Origin: http://foo.example

以下是支持CORS的http://bar.example返回内容的简化版,Access-Control-Allow-Origin头标记该网站可以被跨域访问的源,*代表可以被任意源访问,如果仅允许来自http://foo.example的请求则改为http://foo.example

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *

会发出预检请求的例子

下面是一个需要发送预检请求的从http://foo.example网站的网页或JavaScript访问http://bar.example请求的简化版,下面两个头文件内容是预检请求与其返回内容

OPTIONS /resources/post-here/ HTTP/1.1
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400

下面两个头文件内容是实际请求的内容

POST /resources/post-here/ HTTP/1.1
Host: bar.other
X-PINGOTHER: pingpong
Origin: http://foo.example
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://foo.example

身份凭证的特别处理

当同源时,浏览器请求可以带有Cookie等身份认证信息,但是如果跨源请求需要携带身份凭证,则需要为XMLHttpRequestFetch API进行额外设置。但是只要需要前端进行跨源请求时携带用户凭证,服务器设置的Access-Control-Allow-Origin就不能为*而需要设置为允许跨域请求的来源域名

跨域相关HTTP头

响应中的头

响应头内容需要在服务器端进行定义,具体定义方法需要根据后端使用语言、框架不同有所改变。

  • Access-Control-Allow-Origin: <origin http address> | *:设置允许跨域访问该资源的域名,设置为通配符*时凭证信息将不会被携带
  • Access-Control-Expose-Headers: <headers>[, <headers>]*: 设置浏览器可访问请求头的白名单,设置之后getResponseHeader()就可访问默认白名单外的请求头
  • Access-Control-Max-Age: <seconds>:指定OPTIONS预检请求最长有效时间
  • Access-Control-Allow-Credentials: true:指定当跨源身份凭证发送时浏览器是否可以读取返回内容,如果用在预检请求上,将决定浏览器在发出正式请求时是否携带有凭证,如果请求无预检请求例如GET,则该响应会被忽略且浏览器也不会将内容返回给网页
  • Access-Control-Allow-Methods: <method>[, <method>]*:指明实际请求所使用的HTTP方法
  • Access-Control-Allow-Headers: <field-name>[, <field-name>]*:指明了实际请求允许携带的首部字段

请求中的头

  • Origin: <origin>:指明了请求源站地址,不包含任何路径信息,只包含服务器名称
  • Access-Control-Request-Method: <method>:在预检请求上表明实际请求所使用的HTTP方法
  • Access-Control-Request-Headers: <field-name>[, <field-name>]*:在预检请求上表明实际所携带的首部字段

跨域问题CORS笔记的更多相关文章

  1. 跨域资源共享(CORS)问题解决方案

    CORS:Cross-Origin Resource Sharing(跨域资源共享) CORS被浏览器支持的版本情况如下:Chrome 3+.IE 8+.Firefox 3.5+.Opera 12+. ...

  2. asp.net core webapi之跨域(Cors)访问

    这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...

  3. ajax跨域请求学习笔记

    原文:ajax跨域请求学习笔记 前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可 ...

  4. 跨域资源共享CORS与JSONP

    同源策略限制: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说 ...

  5. rest_framework 跨域和CORS

      跨域和CORS   本节目录 一 跨域 二 CORS 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 跨域 同源策略(Same origin policy)是一种约定, ...

  6. Nginx配置跨域请求 CORS

    当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服 ...

  7. day 92 跨域和CORS

      跨域和CORS   本节目录 一 跨域 二 CORS 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 跨域 同源策略(Same origin policy)是一种约定, ...

  8. 跨域问题-cors

    什么是跨域如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨站请求.比如,使用 XMLHttpRequest 对象发起 HTTP 请求就必须遵守同源策略(same-origin policy). 具 ...

  9. springmvc springboot 跨域问题(CORS)

    官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html springmvc s ...

  10. springboot 项目跨域问题 CORS

    package com.example.demo.cors; import org.springframework.context.annotation.Bean; import org.spring ...

随机推荐

  1. 21克:仅需3天,我们就用Quick BI搭建起数据驾驶舱

    ​简介:数智化并不仅仅是大型企业才需要去思考的课题,而是摆在所有企业面前的一个可选项.借助Quick BI搭建的数据分析体系,21克实现了销售.财务.供应链等多部门业务的数据化支撑,从一份份本地化的E ...

  2. 技术揭秘:从双11看实时数仓Hologres高可用设计与实践

    ​简介:本文将会从阿里巴巴双11场景出发,分析实时数仓面临的高可用挑战以及针对性设计. 2021年阿里巴巴双11完美落下为帷幕,对消费者来说是一场购物盛宴,对背后的业务支撑技术人来说,更是一场年度大考 ...

  3. MaxCompute 挑战使用SQL进行序列数据处理

    简介: MaxCompute 挑战使用SQL进行序列数据处理 --而不是用MR和函数 日常编写数据加工任务,主要的方法就是使用SQL.第一是因为自己对SQL掌握的比较好(十多年数据开发经验,就这几个关 ...

  4. Hologres揭秘:如何支持超高QPS在线服务(点查)场景

    简介: 本期我们将揭秘Hologres如何支持超高QPS在线服务(点查)场景. Hologres(中文名交互式分析)是阿里云自研的一站式实时数仓,这个云原生系统融合了实时服务和分析大数据的场景,全面兼 ...

  5. Morphling:云原生部署 AI , 如何把降本做到极致?

    ​简介: Morphling 本意是游戏 Dota 中的英雄"水人",他可以根据环境要求,通过灵活改变自身形态,优化战斗表现.我们希望通过 Morphling 项目,实现针对机器学 ...

  6. 性能提升3倍、时延降低70%,阿里云企业级存储ESSD云盘再升级!

    9月22日,阿里云存储年度新品发布会上,阿里云基础产品资深产品总监陈起鲲发布了其全球领先的旗舰级块存储产品ESSD的两款新规格(ESSD Auto PL.ESSD PL-X),并宣布了新增的多项企业级 ...

  7. [Caddy2] Caddyfile 静态文件托管 file_server 的 hide 用法

      file_server 语法: file_server [<matcher>] [browse] { root <path> hide <files...> i ...

  8. WPF 已知问题 开启 IsManipulationEnabled 之后触摸长按 RepeatButton 不会触发连续的 Click 事件

    本文记录 WPF 的一个已知问题,在 RepeatButton 上开启 IsManipulationEnabled 漫游支持之后,将会导致触摸长按到 RepeatButton 之上时,不会收到源源不断 ...

  9. WPF 基于 Azure 的认知服务 情绪分析 语言检测 关键短语提取

    本文主要是来安利大家基于 Azure 的认知服务,主要是文本认知服务,可以做到分析输入文本的情绪,以及判断当前输入文本所属语言等功能 本文分为两个部分 ,一个就是在 Azure 上的配置,另一个就是 ...

  10. 2019-4-29-win10-uwp-使用-Border-布局

    title author date CreateTime categories win10 uwp 使用 Border 布局 lindexi 2019-04-29 12:29:45 +0800 201 ...